如何在同一应用的多个实例之间维护消息顺序

3
我们有一个非常简单的应用程序,它从MQ中读取消息并将消息转换为不同的格式,然后发送到另一个MQ。 应用程序部署在Openshift环境中。因此,在任何给定时间,同一应用程序的多个实例将运行。我们在应用程序中没有使用任何数据库。
我们想要维护信息的顺序。 基本上,在读取信息时,它们按照某种顺序出现在源MQ中(例如A1-A2-A3-A4-A5),然后经过转换后,它们应该按照相同的顺序出现在out MQ中。
例如:假设事件A1已发生,然后是A2、A3、A4和A5。事件A1和A3是相互关联的,即具有某些关系。相同应用程序的多个实例正在专用队列上监听这些事件。假设有5个应用程序实例正在运行,那么有可能存在这样一种情况,即选择了A3事件的实例已经完成处理,而A1事件的处理仍未完成。因此,基本上我想确保在其前面的事件A1成功完成并发送到Out队列之前,不应该将A3处理的输出发送到Out队列。
请问是否有人能帮助我解决这个问题?

如果第二个作业由于常见故障(如网络问题)未收到A1,您会期望什么行为? - Abhinav Mathur
这些消息是否属于某种会话?我的意思是,是否有一种逻辑方式可以将一批消息组合在一起,或者它们都需要按顺序处理? - David Guida
1
如果您有多个应用程序接收消息,则会出现消息顺序混乱的情况。例如,Instance1接收消息,发出回复; Instance2接收消息,发出回复。Instance 2提交,Instance 1提交。短暂时间内,Reply2在提交Reply1之前可用。股票交易所需要按严格顺序处理公司的股票订单。他们通过拥有多个队列来解决此问题。QUEUE A_B用于以A或B开头的所有股票,QUEUE C用于以C开头的所有股票... V-Z ...等等。对于每个队列,他们都有一个应用程序来处理该队列。 - colin paice
@JoshMc 通常消息会有所不同;只有在之前接收到的消息状态发生变化时,我们才会收到修改后的消息。基本上我正在寻找一种方法,在修改后的消息之前不应处理其先前版本。希望你明白我在寻找什么。将进一步完善问题以获得更好的清晰度。 - vivek075
你不需要10,000个队列,只要它们始终保持一致分割即可按照自己的方式进行分割。我知道一个应用程序,它基于消息的某个字段创建了哈希,并拥有20个读取器,每个读取器只处理哈希的子集,但总体上所有哈希都被处理了。 - JoshMc
显示剩余4条评论
2个回答

0

当消费消息时,按照分类存储在文件中。当消息被消费并根据分类决定了分组时,更新文件。可以通过第一种方式的第一个答案来完成:您需要在程序中指定一条消息和一个组ID,然后它将作为一个组处理消息。


0

IBM MQ 具有将消息分组的内置功能。我建议您查看 消息组


你能帮我理解它将如何解决问题吗? - vivek075
我给你提供了链接,请阅读有关消息组的内容。当一个实例开始接收某个组的消息时,其他实例将不会再收到该组中的任何消息。 - Roger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接