1. 消息队列的模式
1)简单模式:当客户端(生产者)将消息写入到消息队列中时,消息队列中消息的数量加1,消费者实时监听消息队列,当队列中有消息时,
则获取消息,之后执行业务逻辑,同时消息队列的消息数量减1。
特点:一个生产者P发送消息到队列Q,一个消费者C接收。
2)工作模式:由一个生产者负责消息写入队列,但是如果只有一个消费者负责消费,可能会造成消息的积压,所以准备多个消费者共同消费
一个队列中的消息。
特点:一个生产者,多个消费者,每个消费者获取到的消息唯一,多个消费者只有一个队列。
3)发布/订阅模式(Publish/Subscribe):一个生产者发送的消息会被多个消费者获取,每个消费者得到的消息是一样的,这点不同于工作模式。
topic:含义是服务端存放消息的容器
比如微信公众号,不同的人订阅同一个公众号,收到的消息都是一样的。
发布者发送到topic的消息,只有订阅了topic的订阅者才会收到消息。topic实现了发布和订阅,当你发布一个消息,
所有订阅这个topic的服务都能得到这个消息,所以从1到N个订阅者都能得到这个消息的拷贝。
4)路由模式:路由模式是发布/订阅模式的升级,通过定义不同的key(可以是正则匹配)使得程序将消息发送到不同的队列中。
对于每类消息队列可以有多个订阅者,它们收到的消息都相同。
2. 路由模式的消息队列具体实现
1)消息处理函数对象的抽象,当消息队列要处理消息的时候,只需请求基于这个抽象的类型所定义的对象,而无需关心具体的实现。
M:消息类型参数化。 T:消息处理类类型参数化。
很明显,想使用该类型,程序员需要实现一个处理特定类型(M)消息的消息处理类(T)。M可以是int, string等,当然也可以是一个类类型。
template <typename T, typename M> class MsgHandleInterface { typedef void (T::*Handle)(const M &); // 指向T类中一个函数的指针 public: MsgHandleInterface(Handle fp, T *obj) : _handle(fp), _obj(obj) {} ~MsgHandleInterface() {} public: void Func(const M &msg) // 请求该类型对象中的Func函数进行消息处理 { (_obj->*_handle)(msg); } private: Handle _handle; T *_obj; };