消息队列:我们可以在消息进入队列时触发事件吗?

Posted

技术标签:

【中文标题】消息队列:我们可以在消息进入队列时触发事件吗?【英文标题】:Message Queue: Can we trigger events when a message enters the queue? 【发布时间】:2011-05-14 10:42:33 【问题描述】:

在工作中,我们正在讨论是否为我们的 php 应用程序实现消息队列。目前我们正在研究 Apache 的 ActiveMQ。我们不完全清楚的一件事是是否可以根据到达队列的消息触发进程。

到目前为止,我们发现的文献似乎表明消息队列是一种基于拉取的机制:进程定期运行(作为守护进程或 cron),并从队列中拉取传入的消息。有没有可能把它变成一个推送机制?也就是说,有没有办法让消息队列在消息到达时实际发起 HTTP 请求(或进程)?我们发现的一个选项是发布/订阅模型,但这需要在无限循环中运行我们的 PHP 应用程序以保持与 ActiveMQ 实例的开放 (TCP) 连接,这感觉有点杂乱无章。

任何意见将不胜感激。

【问题讨论】:

【参考方案1】:

一个明显的解决方案是让发布者在存储消息后立即发起 HTTP 请求,但这引出了一个问题,那你为什么要使用消息队列?

让一组消费者在队列上监听并在消息到来时完成他们的工作并不是一个杂乱无章的事情,它是一个很好的、可扩展的设计。 (虽然我同意在无限循环中运行 PHP 进程有其缺点。)

为什么选择消息队列而不是存储消息的数据库? “生产者”可以将消息作为一行存储在表中,然后使用消息的 PK 触发“消费者”。

【讨论】:

问得好,aib!我们考虑 MQ 的原因是因为应用程序正朝着更灵活的工作流程发展,其中业务逻辑决定了流程的下一步是什么。使用消息队列支持的“bins”范式似乎很自然。 倾听的消费者不是我认为是杂乱无章的部分,这听起来像是非常合理的架构.. 它是 while(1) $client->fetch(); 不受欢迎的构造。 我明白了。我个人的意见是你应该重新考虑运行 PHP 消费者守护进程。如果每条消息都将触发消费者(当 1,000,000 条消息同时到达时会发生什么?),我认为使用 MQ 没有什么意义 - 你也可以从生产者那里调用(或启动)消费者代码在那种情况下。 @kander:那么你需要一个阻塞的 fetch() 函数。幸运的是,能够阻塞 TCP 套接字是 PHP 可以 做的少数多线程/IPC-y 事情之一。 事实上,我敢打赌,有时你需要一个阻塞的 fetch(),有时你需要一个非阻塞的 fetchIfAvailable() 函数。【参考方案2】:

考虑创建一个从队列(JMS 组件)中提取消息并转发到 HTTP 端点(HTTP 组件)的 Camel 路由。您甚至可以决定在 ActiveMQ 代理进程上托管 Camel 路由——创建一种智能路由代理。 ActiveMQ 通过在 ActiveMQ 发行版中捆绑 Camel Core 库来简化此操作。

这是最近的相关/相关帖子:

HTTP Post From ActiveMQ using Camel

【讨论】:

【参考方案3】:

您的应用程序监控队列的设计理念是触发外部应用程序运行的行业方式。 看看 IBM Websphere“触发器监视器应用程序”。在他们的实现中,您可以有多个触发器监视器来启动处理队列中的消息的应用程序,因此它可以很好地扩展,因为触发器监视器在安装应用程序的服务器上运行(如果您设计可伸缩性,您应该能够如果需要,有多个应用服务器)。

【讨论】:

以上是关于消息队列:我们可以在消息进入队列时触发事件吗?的主要内容,如果未能解决你的问题,请参考以下文章

Qt事件机制(是动作发生后,一种通知对象的消息,是被动与主动的总和。先处理自己队列中的消息,然后再处理系统消息队列中的消息)

如何在服务总线队列触发功能中将服务总线消息移动到死信

抛出异常时消息不会进入死信队列

天蓝色队列中的消息消失

我可以监控线程的消息队列的大小吗?

Redis 消息队列的实现