【问题标题】:Fault tolerant / high availability producer容错/高可用生产者
【发布时间】:2012-12-05 03:51:30
【问题描述】:

我正在使用消息队列开发分布式生产者/消费者系统。我对并行化感兴趣的部分是它的消费者方面,我对此感到满意。

但是,我不确定如何处理制作人。我一次只需要一个生产者运行,因为我的系统生产部分的负载不是太高,但我想要一种可靠的方式来管理它,比如启动、停止、重新启动,主要是监控它,以便如果生产者主机出现故障,另一台可以接机。

如果它有帮助,我对我的消费者算法感到满意,即排队作业的算法,因为它可以容错一段时间停机并拾取停机期间发生的事情。

我确信有工具或至少已知的模式可以做到这一点,而不是重新发明轮子。

我使用的是rabbitmq,但可以使用activemq,如果需要,甚至可以重构为storm或类似的东西,我的代码目前并不复杂。

【问题讨论】:

  • 有些是我赞成并从其中许多人那里学到的好答案,但不幸的是,它们都不是“最佳”答案,因此我可以自信地将其标记为对其他用户有效马上来找到我所暴露的问题的解决方案。 (我没有理由不接受答案,是免费的:))
  • 另外,您可能希望将此问题重新标记为更合适的内容 - 可能与监控相关,因为它与您的排队技术没有直接关系
  • 我接受了几个答案,感谢您的提示。对标签有什么建议吗?我对此不了解技术,只是选择这两个来吸引有希望以前经验的人,而不仅仅是理论。
  • 你能详细说明一下你的架构吗?例如,为什么要创建任意数量的生产者?从队列中并行消费正是消息传递的目的;但是,并行“生产”没有多大意义。这个想法是你有一个未知的(但有点可预测)数量的生产者,你的消费者应该能够处理生产者施加在他们身上的负载。
  • 是的 mayer06,我一次只想要一个制作人。我正在寻找的是有一种可靠的方法来确保如果一个失败,另一个将开始自动生产。

标签: activemq rabbitmq


【解决方案1】:

经过几周的思考,想到了最简单的解决方案,我实际上对此非常满意,所以如果你觉得它有用,我会分享它,或者如果你有任何想法,请指出缺点,到目前为止它似乎运行良好。

我在我的数据库中创建了最简单的表,称为 heartbeat,带有一个名为 ts 的时间戳字段,并且始终只有一行。

我每 5 分钟(石英)启动所有潜在的生产者,如果 ts 字段早于 now() - 5 分钟,他们会更新表。因为更新调用是阻塞的,所以我不会遇到数据库线程问题。现在,如果更新返回 > 0,则意味着它实际上修改了 ts 的值,然后我执行实际的生产代码(队列作业)。如果更新返回 0,它没有修改表,因为其他人在不到 5 分钟前做了,因此这个生产者不会做任何事情,直到它在 5 分钟内再次检查。

显然,5 分钟的值是可配置的,如果我有需要的话,这允许通过小的更改进行非常简洁的升级,以便能够同时执行多个生产者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-08
    • 2013-04-16
    • 1970-01-01
    • 1970-01-01
    • 2016-04-23
    • 2023-03-06
    • 1970-01-01
    相关资源
    最近更新 更多