我们有一个ActiveMQ队列,它将每秒接收10万个股票定单消息(每个消息包含json格式的股票名称,卖价,买价)。 在每秒10万条消息中,可以有n张单一股票消息。如果我们收到多条相同库存的消息,则需要使用Java以相同的顺序处理所有这些消息。 我们无法在一台服务器上使用单个侦听器每秒处理10万条消息。 需要使用多个侦听器和服务器来处理它,但要使用与Queue中相同的顺序在UI中显示结果。
读取库存队列->验证请求->在用户界面中更新库存价格
示例消息:- { stockName:“ TCS”, sellPrice:“ 102”, bidPrice:“ 100” }
您能为上述问题提出解决方案吗?
答案 0 :(得分:1)
这是我的建议:
您需要根据库存名称将队列拆分为子队列。您可以根据股票名称的首字母进行拆分。这将为您提供足够的并行功能,同时确保相同库存的所有消息都位于一个队列中。
主队列中需要有一个读取器,但是它所做的就是将消息转发到子队列。
答案 1 :(得分:0)
我建议对主题使用非持久性发布,而不要使用队列。主题为您提供
的灵活性如果需要更多持久性,则可以使用持久性订阅。
在同一发布主题内,都保证了消息顺序,因此您应该将库存名称作为主题的一部分。您可以在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。
在非常高的水平上:
将收到的股票放入环形缓冲区[核心数据结构 该框架是建立在]上的,这将是 ActiveMQ和环形缓冲区的生产者。
消费者/工人[在您的情况下为多个-这里有多个 每个唯一股票名称的工作线程]从中提取股票 按顺序排列的环形缓冲区。在工作者/听众中,您可以 根据条件处理事件。
我刚刚提交了示例代码,试图演示您的用例,以供您参考: https://github.com/reddy73/Disruptor-Example