一个泛型的消息队列实现

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;
};

  

  

  

  

   

猜你喜欢

转载自www.cnblogs.com/yanghh/p/12951713.html