处理请求和未经请求的通信消息

时间:2014-10-21 17:17:41

标签: multithreading communication messaging

这更像是一个概念性问题,并不适用于任何特定的编程语言。

我有两个实体相互通信,允许三种类型的消息:

  1. 命令消息:指示其他实体执行某项操作的未经请求的消息。
  2. 查询消息:未经请求的消息,要求其他实体提供信息。
  3. 响应消息:请求来自其他实体的请求消息。
  4. 现在每个实体都有两个线程:

    1. 读者线程:读取消息。
    2. 工作线程:发送消息并执行有用的操作
    3. 两种可能的通信方案是:

      1. 实体A向实体B发送命令,实体A并不关心之后发生的事情。
      2. 实体A向实体B发送查询,实体A必须等到实体B以答案回应。
      3. 所以问题是,读者线程如何处理被请求和未经请求的消息?

        通过事件可以轻松处理未经请求的邮件。读者线程可以在工作线程上触发一个事件,表示它收到了查询或命令,工作线程可以做出相应的反应。

        但请求的消息很难处理。工作线程发送查询,必须阻塞,直到收到响应或超时。工作线程如何让读者线程知道它正在等待响应,读者线程如何将响应与工作线程的特定查询联系起来,并将该响应传递回工作线程的执行?

        我知道这已经在其他程序中完成了一百万次,所以标准做法是什么?

1 个答案:

答案 0 :(得分:1)

[我使用了Windows Azure Service Bus消息传递实体,因为我对它很熟悉,但一般情况下,任何消息系统都应如此。]

假设您的实体名称是A和B.

  1. 有1个主题(pub-sub实体)和1个队列用于A和B之间的通信(因为您需要双向通信):主题-A2B&队列B2A。 A2B适用于从A到B的命令或从A到B和B2A的查询,如名称所示,适用于从B到A的响应。

  2. 典型的消息系统将提供MessageType属性 - 您可以设置它,然后区分您正在阅读的消息类型并相应地路由它:Example from Windows Azure ServiceBus Brokered Message。使用该属性 - 设置其查询,命令或响应。 这里的想法是 - 在B中收到消息时 - 您将收到使用订阅。你将有2个线程读取 - (一)只读命令(theSecondOne)只读取查询

  3. 对于UnSolicited消息 - 正如您所说,它易于处理。您需要做的就是

    • A应该使用BrokeredMsg.ContentType =" Cmd"向B发送消息。和B应创建一个包含过滤器的订阅并阅读和处理
  4. 对于征求的消息 - 就像查询一样(名为Sessions的功能在这里会派上用场)。

    • A应该向B发送消息,例如: BrokeredMessage.ContentType ="查询"
    • A还在其发送给B的消息上设置相关ID: BrokeredMessage.SessionId =" ABC456" < - A的相关ID以便能够关联此消息
    • 现在A将等待回复,并期望B也设置
      BrokeredMessage.SessionId =" ABC456" < ---与之前设置的完全相同的值。 使用 AcceptMessageSession API - 使用会话ID和超时。例如:Q_B2A_QClient.AcceptMessageSession(" ABC456",2分钟)
    • 在接收端B应创建一个包含过滤器的订阅,以便能够接收这些消息。
    • 一旦B接收到查询 - 它会处理并将结果放回Q-BToA
    • 如果B成功地在不到2分钟的时间内将消息放回Q-B2A中 - 那么A将接收它然后你可以使用Callback方法进一步编排它(因为所有这些都是异步方法 - 你不会需要使用上面提到的任何Reader或Writer线程 - 这将是一个巨大的性能助推器。)
  5. HTH! SREE