聊天机器人:确保在群集环境中基于每个会话的消息的串行处理

时间:2016-07-28 10:27:30

标签: concurrency message-queue messaging distributed chatbot

在云环境中编写Messenger聊天机器人的背景下,我遇到了一些并发问题。

具体而言,我希望确保来自同一会话的传入邮件一个接一个地处理。

作为一种约束,我正在云环境中与工作人员一起处理消息(即工作池的大小可变,工作者实例可能是短暂的并且可能会崩溃)。此外,低延迟很重要。

抽象一点,我的要求是:

  • 我有一串传入消息
  • 这些消息中的每一条都有一个“主题密钥”(会话ID)
  • 这组主题未提前知道,几乎是无限的
  • 我想确保以串行方式处理同一主题的消息
  • 关于一群潜在的短暂工人
  • 如果可能的话,我希望可靠性保证,例如确保每条消息只处理一次。

我的问题是:

  1. 此并发方案是否有 名称
  2. 是否有 技术 (消息代理,协调服务等)实现此功能?
  3. 如果没有,我可以使用什么 算法 在低级并发工具之上实现它? (分布式锁,演员,队列等)

2 个答案:

答案 0 :(得分:1)

我不知道该方案的广泛接受的名称,但解决此类问题的常见策略是路由您的邮件,以便具有相同主题键的所有邮件最终都在同一目的地。有两种技术可以帮到您:

某些消息代理供应商将此要求称为消息分组粘性会话粘性消息负载平衡

具有较弱交付/排序保证(如Amazon SQS)的邮件系统的另一个常见策略是在邮件中简单地包含一个序列号,并将其留到目的地以重新排序并根据需要请求重新发送丢失的邮件

答案 1 :(得分:0)

我认为你可以通过使用队列和集合来解决这个问题。我能想到的是在队列中发送每个消息对象并以先出先后的方式处理它。但是在队列中添加主题名称时,在集合中添加主题名称,并在将其删除以进行处理时从集合中删除主题名称。 所以现在如果你在set中有任何主题,那么不要在队列中添加同一主题的另一个消息对象。 我希望这能帮到您。一切顺利:)