我正在开发一个系统,客户端将数据输入到程序中,并且保存操作会向activemq发送一条消息,以进行更加耗时的处理。
我们遇到的情况是,客户端连续两次更新记录,而该activemq队列上的消费者将同时处理这两个记录。我正在寻找一种方法来确保包含具有相同标识的记录的消息按顺序处理,并且一次只处理一个。要清楚ID 1,1和2(按此顺序)的记录是否发送到activemq,1将处理,然后2(如果1仍在处理中),最后1。
另一个要求(由于卷)要求使用者是多线程的,因此可能有16个线程访问该队列。必须考虑到这一点。
答案 0 :(得分:0)
因此,如果您有多个线程正在读取该队列,并且您希望解决方案接近ActiveMQ,则必须考虑如何扩展与订单关注点相关的内容。
如果您有多个消费者,他们可能以不同的速度运营,您永远无法确定哪个消费者先于另一个消费者。唯一的方法是拥有一个消费者(您仍然可以使用exclusive-consumers来实现高可用性。)
但是,您可以通过其他方式对负载进行分段。在很大程度上取决于您的应用程序。如果你可以创造,比如16"工人"队列(或任何你的最大消费者数量)并将负载分配给这些队列,同时保证来自单个用户的请求总是来到同一个"工作队列",消息顺序将保留给每个用户。
如果您没有很好的方法将用户分组,只需将userID mod MAX_CONSUMER_THREADS
作为一个简单的解决方案。
在消费者逻辑本身中可能有更好的方法来处理这个问题。跟踪序列号并推迟无序更新(scheduled delay可以用于此)。