一、问题描述
WMB消息总线是58内部提供的消息队列服务。消息队列主要解决了应用间的耦合、异步处理事件、流量削峰填谷等问题,是系统架构不可缺少的组件。
现有的消费者客户端,通过注册回调函数来处理消息,
function callback ($msg) {var_dump($msg);} $keyPath = "./testkey.key?clientid=2"; ESBclient_consumer_loop('callback', $keyPath, 123456);
这种使用方式存在一些问题,包括
1)不方便开发调试,需要消息生产者和消费者同时参与。而且多数情况下,生产者和消费者在不同的业务部门,增大了调试成本。
2)消费端依次处理拉取来的消息,性能不高。
3)由于PHP语言本身的特性,对多线程支持不好,消费端不能开启多线程模式。为了加快处理,只能多开进程。但是由于wmb服务端限制,只能开64个消费端,假设处理每个消息需要100ms,QPS上限就是640左右。
4)消费者客户端和消息处理代码耦合在一起,而且与业务集群要分开部署,浪费机器。
二、引入代理
计算机领域有句话:“计算机科学中的任何问题都可以通过增加一个中间层来解决”。为了解决上面的问题,引入了消费队列代理。代理通过消费客户端拉取消息,然后分发到真正处理消息的接口上,回调接口可以部署在本机,也可以在其他机器。设计图如下:
主进程启动后&