格式化消息以进行排队的最佳方法是啥?

Posted

技术标签:

【中文标题】格式化消息以进行排队的最佳方法是啥?【英文标题】:What is the best way to format messages for queueing?格式化消息以进行排队的最佳方法是什么? 【发布时间】:2011-01-27 12:00:09 【问题描述】:

我最近一直在阅读消息队列,我想为我的应用程序实现一个简单、可扩展的系统。虽然那里有很多关于设置 MQ 系统的好信息,但我找不到很多关于实际实现的信息。

我正在寻找有关如何正确格式化队列消息的模式和最佳实践,以及在 php 中执行作业的方法。我应该使用 JSON、序列化对象、文本、URL 还是 XML?我应该发送什么信息?有switch($job['command']) (或类似的东西)的工人是要走的路,还是有任何既定的模式来实施工人?

帮助不胜感激!

【问题讨论】:

【参考方案1】:

您可以在 PHP 中选择以下任何 MQ 实现,因此您不必自己动手,您可以查看它们的源代码来了解它们的实现。对于一般集成,请查看ActiveMQ page on Enterprise Integration patterns。

http://sourceforge.net/projects/beanstalk/

beantalkd 的 PHP 客户端库。 BeanStalk 允许 PHP 开发人员使用 beanstalkd 内存工作队列服务器 (http://xph.us/software/beanstalkd)。

http://kr.github.com/beanstalkd/

Beanstalk 是一种简单、快速的工作队列服务。它的界面是通用的,但最初的设计目的是通过异步运行耗时的任务来减少大容量 Web 应用程序中页面查看的延迟。

http://activemq.apache.org/

Apache ActiveMQ 是最流行和最强大的开源消息传递和集成模式提供商。 Apache ActiveMQ 速度快,支持许多跨语言客户端和协议,带有易于使用的企业集成模式和许多高级特性,同时完全支持 JMS 1.1 和 J2EE 1.4。 Apache ActiveMQ 在 Apache 2.0 许可下发布

http://memcachedb.org/memcacheq/

Memcachedb 是一个为持久化而设计的分布式键值存储系统。它不是缓存方案,而是高频读写的持久化存储。它符合 memcache 协议(未完成,见下文),因此任何 memcached 客户端都可以与其连接。 Memcachedb 使用 Berkeley DB 作为存储后端,因此支持包括事务和复制在内的许多功能。

http://www.zend.com/en/products/server/

Zend Server 5.0 包含 Job Queue,为创建、执行和管理作业提供全面支持,以优化应用程序性能并减少服务器负载,最大限度地减少应用程序瓶颈并改善最终用户体验。

https://www.dropr.org/

dropr 是一个用 PHP 编写的分布式消息队列框架。主要目标是:

可靠且持久(故障安全)- 通过网络发送消息 没有单一(故障点)服务器实例的分散式架构 易于设置和使用 队列存储和消息传输的模块化(目前已实现文件系统存储和 curl-upload)

http://gearman.org/

Gearman 提供了一个通用的应用程序框架,可以将工作分包给更适合完成工作的其他机器或进程。它允许您并行工作、负载平衡处理以及在语言之间调用函数。

http://www.zeromq.org/

ØMQ(也拼写为 ZeroMQ、0MQ 或 ZMQ)是一个高性能异步消息传递库,旨在用于可扩展的分布式或并发应用程序。它提供了一个消息队列,但与面向消息的中间件不同,ØMQ 系统可以在没有专门的消息代理的情况下运行。该库旨在具有熟悉的套接字样式 API。

【讨论】:

我倾向于使用简单的文本(对于非常简单的消息)或 Json。对于基于 PHP 的 beanstalkd 客户端,我还推荐 Pheanstalkd:github.com/pda/pheanstalk【参考方案2】:

如果可以的话,我会使用 JSON——它简洁、易于阅读并且可以跨语言工作。

您可能无法使用 JSON 的一个原因是,如果您希望您的后台“工作”不仅包含数据(在这种情况下 JSON 会很好),而且包含序列化对象。如果是这种情况,您至少需要将作业的一个参数序列化为 PHP。

【讨论】:

以上是关于格式化消息以进行排队的最佳方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 FIFO 排队系统中,实现优先级消息传递的最佳方式是啥

将 json 格式的键值对转换为以符号为键的 ruby​​ 哈希的最佳方法是啥?

格式化此数字的最佳方法是啥?

为 Kindle 格式化 LaTeX 源代码的最佳方法是啥? [关闭]

使用 Spring JMS 进行错误处理的最佳实践

从 pdf 文件导入/读取数据的最佳方法是啥?