messaging - IBM MQ - 一对多消息流

标签 messaging ibm-mq

我的问题是关于在 IBM MQ 中使用单个队列的一对多消息流。我是 MQ 新手。

场景 - 假设有多个进程从单个队列中读取消息,当它们从队列中读取消息时,是否所有进程都得到相同的消息。

ie - 假设队列上没有消息,并且两个读取器被阻塞(在其上执行了 MQGET)。

  1. 1 条消息进入队列(逻辑上意味着进程 1)。两者都会在等待时收到消息(对其执行 MQGET),还是随机只向一个进程发送消息。

  2. 消息被读取后,就会从队列中删除。

  3. 如果消息在读取后从队列中删除,假设进程 1 正在处理并且收到一条新消息,而进程 2 获取了该消息并被删除。当进程 1 尝试获取时,它不会收到任何消息。这可能吗。

基本上我想知道如何管理单个队列上的多个进程,以便消息进入正确的进程并且不会丢失任何消息。

最佳答案

如果不使用选择器,则在队列上读取消息的多个应用程序会竞争消息。直接 FIFO 读取将消息传送到竞争应用程序,这样任何一条消息都会传送到其中一个应用程序实例一次。假设应用程序在同步点之外获取消息或发出COMMIT,那么其他应用程序将不会看到该消息,并且它将被永久删除。

改变行为的因素包括:

  • 消息选择器。如果应用程序通过 MsgID 或其他选择标准获取消息,则 QMgr 仅向应用程序发送符合选择的消息。如果多个应用实例使用相同的选择标准,它们会竞争选择器定义的子集中的消息。
  • 回滚。如果应用程序回滚消息,该消息将再次可用,并且可能会转到相同或不同的应用程序实例。
  • 优先交付。行为与 FIFO 相同,只不过消息按优先级排序,优先级最高的消息先传送。
  • 消息组。可以按组 ID 选择消息,并指定在组中的所有消息都存在之前 GET 不会成功。如果部分组进入队列,则可以看到队列的深度,但没有消息传递到应用程序。

一次一个地查看您的问题:

  1. 消息进入队列(逻辑上意味着进程 1)。两者都会在等待时收到消息(在其上执行 MQGET),还是随机只收到一个进程。
    排队很便宜。如果应用程序正在读取 FIFO,请勿将发往 App1 和 App2 的消息放在同一队列中。在不同应用程序(或同一应用程序的不同实例)之间共享队列的唯一方法是,从队列中读取的所有内容都使用选择器,并且选择器有效地隔离消息,以便它们转到正确的应用程序。如果只有一个实例正在运行 FIFO,那么它就不起作用。

  2. 消息被读取后,就会从队列中删除。
    可以,只要应用程序在同步点之外发出 GET 后跟 COMMITGET 即可。如果应用程序浏览队列,则该消息将保留下来,并在浏览光标移出队列后可供其他应用程序使用。

  3. 如果消息在读取后从队列中删除,假设进程 1 正在处理并且收到一条新消息,而进程 2 获取了该消息并被删除。当进程 1 尝试获取时,它不会收到任何消息。这可能吗。
    当然。如前所述,以 FIFO 模式读取队列的应用程序或应用程序实例将竞争消息。如果确实有一条消息到达“进程 1”,则要么使用选择器来阻止其他进程读取该消息,要么为每个实例使用不同的队列。

关于messaging - IBM MQ - 一对多消息流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12825344/

相关文章:

c# - 有没有办法通过 C# 中的 Type.InvokeMember 或消息调用窗体或类的私有(private)函数?

go - 如何让 ZeroMQ 使出站排队但未在设定时间内发送的消息超时?

Java JMS 消息传递

messaging - ZeroMq 路由器静默丢弃消息

Java 客户端监听 WebSphere MQ 服务器?

java - MQMessage 读取或删除

java - 编写一个简单的应用程序将消息注入(inject)队列

vb6 - IBM MQSeries ActiveX 写入消息错误

java - 使用绑定(bind)到远程 MQ 的 JMS 连接

java - RabbitMQ 订阅者超时