ActiveMQ - 我可以用延迟消息队列替换调度程序插件吗?

时间:2021-06-08 22:56:23

标签: jms activemq stomp

我对 ActiveMQ scheduler plugin 做了一些工作。这简化了在低音量下延迟传送的消息调度,但是当我进入 100ks 消息时,系统在两个关键方面出现故障。

  1. 在调度程序中排队消息非常慢(与队列相比)。
  2. 尝试查看仪表板中的计划会导致 ActiveMQ 实例崩溃。

现有的调度程序感觉有点僵硬,并没有按预期执行。所以,重新思考我想要一个 jobsjobs-scheduled 队列的问题。发送到 jobs-scheduled 队列的消息将有一个 ttl 标头,其中包含应该传送的 Unix 时间戳。一个进程将在 cron 作业上运行,该作业将从 jobs-scheduled 队列中获取消息并使用选择器将其发送到 jobs 队列,以仅挑选出经过 ttl convert_string_expressions:ttl < %(now)s 的消息。

我的两个问题是:

  1. 此策略是否适用于大规模延迟消息,或者我会在选择器周围发现扩展问题吗?如果这有所作为,这些消息将被保留。
  2. ActiveMQ 中是否存在允许我使用选择器查询将消息从一个队列发送到另一个队列的功能?

2 个答案:

答案 0 :(得分:1)

ActiveMQ 是一个消息代理,而不是一个作业调度程序,因此您尝试做的实际上超出了代理的意图范围。是的,ActiveMQ 确实具有预定消息功能,但这不适用于大规模作业队列类型的工作,它是提供一些最小延迟交付的简单功能。

您正在寻找的听起来更像是 Quartz 或其他一些批处理作业调度库。您可以为 ActiveMQ 开发自己的作业调度程序实现或在插件中执行某些操作,但您实际上是在尝试违背代理的意图,即以解耦方式尽快传递消息。

答案 1 :(得分:-1)

旁注 - 可能偏离主题。

过去我不得不解决一个类似的情况,在这种情况下,提前将消息加载到队列中以减少总传输时间很有意义。

我通过使用 Camel 路由和侧信道激活解决了这个问题。 Camel 允许您以编程方式启动和停止路由,因此您可以在给定时间段内加载没有消费者的队列。然后使用专用队列进行控制,您发送“开始”消息。控制路由接收到“开始”消息,然后激活主数据处理路由。然后,您需要配置某种“停止”消息语义,以便为下一次运行做好准备。

实际上,您可以通过更多地控制调度并减少数据到队列加载时间问题来获得延迟行为模式。您还可以通过跨多个队列加载数据来解决扩展问题。