我的问题是关于在 IBM MQ 中使用单个队列的一对多消息流。我是 MQ 新手。
场景 - 假设有多个进程从单个队列中读取消息,当它们从队列中读取消息时,是否所有进程都得到相同的消息。
ie - 假设队列上没有消息,并且两个读取器被阻塞(在其上执行了 MQGET)。
1 条消息进入队列(逻辑上意味着进程 1)。两者都会在等待时收到消息(对其执行 MQGET),还是随机只向一个进程发送消息。
消息被读取后,就会从队列中删除。
如果消息在读取后从队列中删除,假设进程 1 正在处理并且收到一条新消息,而进程 2 获取了该消息并被删除。当进程 1 尝试获取时,它不会收到任何消息。这可能吗。
基本上我想知道如何管理单个队列上的多个进程,以便消息进入正确的进程并且不会丢失任何消息。
最佳答案
如果不使用选择器,则在队列上读取消息的多个应用程序会竞争消息。直接 FIFO 读取将消息传送到竞争应用程序,这样任何一条消息都会传送到其中一个应用程序实例一次。假设应用程序在同步点之外获取消息或发出COMMIT
,那么其他应用程序将不会看到该消息,并且它将被永久删除。
改变行为的因素包括:
- 消息选择器。如果应用程序通过
MsgID
或其他选择标准获取消息,则 QMgr 仅向应用程序发送符合选择的消息。如果多个应用实例使用相同的选择标准,它们会竞争选择器定义的子集中的消息。 - 回滚。如果应用程序回滚消息,该消息将再次可用,并且可能会转到相同或不同的应用程序实例。
- 优先交付。行为与 FIFO 相同,只不过消息按优先级排序,优先级最高的消息先传送。
- 消息组。可以按组 ID 选择消息,并指定在组中的所有消息都存在之前 GET 不会成功。如果部分组进入队列,则可以看到队列的深度,但没有消息传递到应用程序。
一次一个地查看您的问题:
消息进入队列(逻辑上意味着进程 1)。两者都会在等待时收到消息(在其上执行 MQGET),还是随机只收到一个进程。
排队很便宜。如果应用程序正在读取 FIFO,请勿将发往 App1 和 App2 的消息放在同一队列中。在不同应用程序(或同一应用程序的不同实例)之间共享队列的唯一方法是,从队列中读取的所有内容都使用选择器,并且选择器有效地隔离消息,以便它们转到正确的应用程序。如果只有一个实例正在运行 FIFO,那么它就不起作用。消息被读取后,就会从队列中删除。
可以,只要应用程序在同步点之外发出GET
后跟COMMIT
或GET
即可。如果应用程序浏览队列,则该消息将保留下来,并在浏览光标移出队列后可供其他应用程序使用。如果消息在读取后从队列中删除,假设进程 1 正在处理并且收到一条新消息,而进程 2 获取了该消息并被删除。当进程 1 尝试获取时,它不会收到任何消息。这可能吗。
当然。如前所述,以 FIFO 模式读取队列的应用程序或应用程序实例将竞争消息。如果确实有一条消息到达“进程 1”,则要么使用选择器来阻止其他进程读取该消息,要么为每个实例使用不同的队列。
关于messaging - IBM MQ - 一对多消息流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825344/