聊天机器人:确保在集群环境中按对话对消息进行串行处理
Chat bots: ensuring serial processing of messages on a per-conversation basis in clustered environment
在云环境中编写 Messenger 聊天机器人时,我遇到了一些并发问题。
具体来说,我想确保来自同一对话的传入消息一个接一个地得到处理。
作为限制条件,我正在云环境中与工作人员一起处理消息(即工作人员池的大小可变,工作人员实例的生命周期可能很短,可能会崩溃)。此外,低延迟也很重要。
所以抽象一点,我的要求是:
- 我有一连串的传入消息
- 每条消息都有一个 'topic key'(对话 ID)
- 主题集无法提前知晓,实际上是无限的
- 我想确保相同主题的消息被串行处理
- 在一组潜在的临时工作人员上
- 如果可能,我想要可靠性保证,例如确保每条消息都被恰好处理一次。
我的问题是:
- 这个并发场景有name吗?。
- 是否有开箱即用的技术(消息代理、协调服务等)?
- 如果不是,我可以使用什么 算法 在较低级别的并发工具之上实现它? (分布式锁、actor、队列等)
我想你可以通过使用队列和集合来解决这个问题。我能想到的是发送队列中的每个消息对象并按照先进先出的方式处理它。但是,将其添加到队列中时,将主题名称添加到集合中,将其取出进行处理时,从集合中删除主题名称。
所以现在如果你有任何主题,那么不要在队列中添加另一个相同主题的消息对象。
我希望这能帮到您。祝一切顺利:)
我不知道该场景有一个被广泛接受的名称,但解决此类问题的一个常见策略是路由您的消息,以便所有具有相同主题键的消息最终到达相同的目的地.一些技术可以为您做到这一点:
- 使用 Apache ActiveMQ、HornetQ 或 Apache ActiveMQ Artemis,您可以将主题键用作 JMSXGroupId to ensure all messages with the same topic key are processed in-order by the same consumer, with failover
- 使用 Apache Kafka,您可以使用主题键作为分区键,will also ensure all messages with the same topic key are processed in-order by the same consumer
一些消息代理供应商将此要求称为消息分组、粘性会话或粘性消息负载平衡.
另一种在 delivery/ordering 保证较弱的消息传递系统上的常见策略(如 Amazon SQS)是简单地在消息中包含一个序列号,并将其留给目的地重新排序并请求重新传递根据需要丢失消息。
在云环境中编写 Messenger 聊天机器人时,我遇到了一些并发问题。
具体来说,我想确保来自同一对话的传入消息一个接一个地得到处理。
作为限制条件,我正在云环境中与工作人员一起处理消息(即工作人员池的大小可变,工作人员实例的生命周期可能很短,可能会崩溃)。此外,低延迟也很重要。
所以抽象一点,我的要求是:
- 我有一连串的传入消息
- 每条消息都有一个 'topic key'(对话 ID)
- 主题集无法提前知晓,实际上是无限的
- 我想确保相同主题的消息被串行处理
- 在一组潜在的临时工作人员上
- 如果可能,我想要可靠性保证,例如确保每条消息都被恰好处理一次。
我的问题是:
- 这个并发场景有name吗?。
- 是否有开箱即用的技术(消息代理、协调服务等)?
- 如果不是,我可以使用什么 算法 在较低级别的并发工具之上实现它? (分布式锁、actor、队列等)
我想你可以通过使用队列和集合来解决这个问题。我能想到的是发送队列中的每个消息对象并按照先进先出的方式处理它。但是,将其添加到队列中时,将主题名称添加到集合中,将其取出进行处理时,从集合中删除主题名称。 所以现在如果你有任何主题,那么不要在队列中添加另一个相同主题的消息对象。 我希望这能帮到您。祝一切顺利:)
我不知道该场景有一个被广泛接受的名称,但解决此类问题的一个常见策略是路由您的消息,以便所有具有相同主题键的消息最终到达相同的目的地.一些技术可以为您做到这一点:
- 使用 Apache ActiveMQ、HornetQ 或 Apache ActiveMQ Artemis,您可以将主题键用作 JMSXGroupId to ensure all messages with the same topic key are processed in-order by the same consumer, with failover
- 使用 Apache Kafka,您可以使用主题键作为分区键,will also ensure all messages with the same topic key are processed in-order by the same consumer
一些消息代理供应商将此要求称为消息分组、粘性会话或粘性消息负载平衡.
另一种在 delivery/ordering 保证较弱的消息传递系统上的常见策略(如 Amazon SQS)是简单地在消息中包含一个序列号,并将其留给目的地重新排序并请求重新传递根据需要丢失消息。