如何使用Java中的多个服务器按顺序从队列中处理消息

时间:2019-05-23 13:52:08

标签: java multithreading jms activemq

我们有一个ActiveMQ队列,它将每秒接收10万个股票定单消息(每个消息包含json格式的股票名称,卖价,买价)。 在每秒10万条消息中,可以有n张单一股票消息。如果我们收到多条相同库存的消息,则需要使用Java以相同的顺序处理所有这些消息。 我们无法在一台服务器上使用单个侦听器每秒处理10万条消息。 需要使用多个侦听器和服务器来处理它,但要使用与Queue中相同的顺序在UI中显示结果。

读取库存队列->验证请求->在用户界面中更新库存价格

示例消息:- {    stockName:“ TCS”,    sellPrice:“ 102”,    bidPrice:“ 100” }

您能为上述问题提出解决方案吗?

3 个答案:

答案 0 :(得分:1)

这是我的建议:
您需要根据库存名称将队列拆分为子队列。您可以根据股票名称的首字母进行拆分。这将为您提供足够的并行功能,同时确保相同库存的所有消息都位于一个队列中。 主队列中需要有一个读取器,但是它所做的就是将消息转发到子队列。

答案 1 :(得分:0)

我建议对主题使用非持久性发布,而不要使用队列。主题为您提供

的灵活性
  1. 选择订阅通配符和
  2. 稍后可能会向该体系结构添加其他服务。您现在可能不需要此功能,但是也许5年后您将需要其他GUI或某种形式的监视或重放服务。如果您使用主题,则只需插入新订阅者即可-无需为这些主题更改发布方...

如果需要更多持久性,则可以使用持久性订阅。

在同一发布主题内,都保证了消息顺序,因此您应该将库存名称作为主题的一部分。您可以在ORDER.STOCK.TCS之类的东西上发布。

但是基于股票名称的均衡负载非常棘手,因为有些字母(例如Z)非常罕见,而另一些字母则很常见。因此,除了股票名称外,还将股票名称的hash%100添加到主题中。例如,如果TCS的哈希码为12357,并且您对100做模,则将其发布到ORDER.STOCK.TCS.57

假设您有10个订阅者,那么每个订阅者可以进行10个订阅。例如,订户1会订阅ORDER.STOCK。*。0,ORDER.STOCK。*。1,... ORDER.STOCK。*。9

订户2将订阅ORDER.STOCK。*。10,ORDER.STOCK。*。11,... ORDER.STOCK。*。19

如果您有5个订阅者,那么每个订阅者都会进行20个订阅(您会明白这一点)。 原因是

答案 2 :(得分:0)

我们有类似的要求,我们使用了一个称为LMAX Disruptor的开源框架,该框架据说是高性能的并发框架。您可以尝试一下https://github.com/LMAX-Exchange/disruptor/wiki/Getting-Started

在非常高的水平上:

  1. 将收到的股票放入环形缓冲区[核心数据结构 该框架是建立在]上的,这将是 ActiveMQ和环形缓冲区的生产者。

  2. 消费者/工人[在您的情况下为多个-这里有多个 每个唯一股票名称的工作线程]从中提取股票 按顺序排列的环形缓冲区。在工作者/听众中,您可以 根据条件处理事件。

我刚刚提交了示例代码,试图演示您的用例,以供您参考: https://github.com/reddy73/Disruptor-Example