java - 如何选择主题与队列

标签 java concurrency jms messaging eai

当我们设计应用程序时如何选择Topic/Queue类型实现。
我知道,
a) 如果多个消费者使用该消息,则使用 Topic
b) 如果只有一个消费者则使用Queue

请提供更多需要考虑的要点?
例如并发、消息持久化、负载均衡等等?

谢谢。
RW

最佳答案

如果只有一个消费者使用队列,情况并不完全正确。

我们有一个 Java EE 应用程序,我们可以在其中对保险报价进行评级。我们有一个RatingIn 队列和一个RatingOut 队列。我们所有的客户端都会写入RatingIn 队列并从RatingOut 队列中读取。我们可能有近 300 多个客户。

多个客户端访问同一队列进行读取的技巧是使用消息头中的correlationID。让它对客户来说是独一无二的,他们只会收到他们独特的信息。我们所做的就是在客户端中将这个correlationID 设置为绑定(bind)到RatingIn 的消息。然后,服务器获取该属性并写入消息,并将其写回到RatingOut。这可以为唯一的客户端保留唯一的消息,但不需要 300 多个队列(考虑到我们公司的应用服务器管理员数量,这很快就会变得难以管理)。

我认为这更多的是与发布方式有关。如果您希望发布一条仅针对一个消费者的消息,请使用队列。如果您希望发布一条针对多个消费者的消息,但又不想生成大量消息(并且您可能也不知道必须为多少个消费者发布消息),那么请使用主题。

关于java - 如何选择主题与队列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9529220/

相关文章:

java - 即使 .class 文件存在,也会出现 java.lang.NoClassDefFoundError 错误

java - Spring MVC 3.0 下划线绑定(bind)请求参数

php - 如何在 PHP 和 JS 中并发 session 之间进行通信?

xml - 用于 HTTP 和 JMS 的负载测试工具

java - ActiveMQ 向 StompConnection 注册监听器

java - 递归方法在返回值后继续?

java - 在 Java 中,如何在单线程程序中抛出 ConcurrentModificationException?

python-3.x - 为什么我的进程列表在运行 aiohttp 时显示多个线程?

java - 从 Spring JMS 捕获 MQ 关闭事件

java - 不允许将 GWT addValueChangeHandler 添加到 RichTextBox,需要另一种方法