RabbitMQ, Kafka和Pulsar (二)

接上篇:https://mp.csdn.net/postedit/85918085

我们用Kafka试试同样的需求。

之前提到Kafka天生支持消息存储和回看,Kafka中的概念有:

  • Producer: 消息生产者
  • Topic: 接受Producer产生的消息,存储消息,每个Topic下都会有若干Partition。
  • Partition: 是Topic下的概念,是一个有序的存储队列,唯一的作用是增加Topic并发的能力,不要想着能用作消息的router,因为跟本文解决的问题不搭干,所以下文只会提到Topic。
  • Consumer/Consumer group: 当成消息的消费者就行了

工作原理如下图:

如上图,每个Topic都有若干Partition, 它是按照消息写入时间为顺序的有序队列,Producer只会在Partition的末尾append新的消息。

如上图,每个Consumer都会记录一个”offset“来记住自己对该Topic/Partition里的消息消费到哪一个了, 这个offset可以作为参数,在consumer读取消息的时候传过来,这样就是为什么Kafka能支持消息回看的原理了。而Topic/Partition对offset一无所知,这就是之前提到的傻Broker,富consumer的说法的来源了。另外offset是存储在zookeeper里的,并不在Kafka中。

好的,言归正传,我们看看用Kafka如何满足我们之前提出的需求:

有两个主要的需求:

  1. Notification, 希望client端(GUI)能直接使用Websocket接口和MQ通信,并且client端只能获取到跟在client端登录的用户相关的消息(不能是把所有消息都介入到client然后再做过滤)。
  2. Log,要支持log的回看以及log的trace

Kafka

  1. 基于client logon的消息通知
    首先Kafka自身是不支持消息路由/过滤的,并且动态的建立和删除Topic都很昂贵,所以决定引入额外的模块做这个功能,在这里就引入Java daemon(可以是GUI的rest service)。所以在这个设计中有两种Topic: Kafka的Topic和java daemon的Topic。
    a. 在Kafka建立Topic, Producer会将所有用户的通知信息发送到这个Topic。
    b. 在Java daemon中建立Consumer接收所有这个Kafka Topic上的信息,使用观察者模式,在收到消息的时候通知所有列表中的Observer。Observer是动态建立的,用于filter消息,只将允许改用户看到的消息发送到在java daemon建立的专属该用户的Topic中。
    c. User logon, 通知后台(java daemon),建立该用户专属Observer,并注册。然后建立该用户专属的Topic,用于接受消息。
    d. Client建立跟它专属Topic(java daemon上)的连接,开始接收消息。
    e. 当User登出或者session过期,跟topic(Java daemon中的)的连接中断以后, 该Observer和Topic被销毁(需要轮询检查)

    非常麻烦,但也可以实现。
  2. Log的回看和trace
    这个就超简单了对吧,使用Kafka本身的特性offset就可以轻松实现。

下回我们看看Pulsar。

猜你喜欢

转载自blog.csdn.net/pushme_pli/article/details/85984404