消息队列的两种模式:
点对点模式:一对一,消息只能给一个人,比较单一。
明显感觉到点对点的模式缺点:就是不可复用,加入这个消息需要给多个人处理,就会很麻烦,flume可以给多个,但是需要多个channel和多个sink
点对点模式如果要复用,就必须发给多个消息队列,然后消费者再去接收。浪费资源。
发布/订阅模式(kafka):
一对多。
它只是一个消息队列,不是文件存储系统,所以保存是有时间限制的,不像hdfs,它有时限要求。
类似于,公众号主动推送文章,大家都能收到消息。
点对点模式:是消费者主动去拉取数据。
发布/订阅模式:是发布者主动推给我的数据。这种方式的坏处是什么?
消息队列的生产速度是由生产者决定的。
生产者一直产生消息给到MQ,因为MQ是一个存储消息的东西(容器),一直灌输给MQ
然后MQ推数据给消费者。问:这个推的速度是由谁决定的呢?这个肯定由当前这个队列来决定的。这个时候就有问题了:下游的消费者的处理能力不一定,
有的消费者10MB/s,有的100MB/s,但是MQ往外面推送数据是50MB/s的话,有些消费者会崩,但是有些会闲置,造成资源浪费。
所以,发布/订阅模式又分为两种:
1、消费者主动从MQ中拉取数据
2、类似订阅在公众号的形式,由up主主动推送数据给那些订阅了自己文章的人。
这里强调一下:kafka是发布/订阅模式中的消费者主动拉取的方式。
kafka用的广泛这个也是个原因。
发布订阅的好处相对点对点最直观的好处就是,消息可以直接发给多个消费者使用。
又是基于消费者主动拉取数据的方式,所以还有一个好处就是消费者消费的数据由自己决定。
但是消费者主动拉取数据的缺点就是:费性能
消费者想要主动获取数据,就要不断的向MQ中去问,当MQ长时间没有新消息的时候,这个时候消费者还必须去隔一段时间问他是否由新消息。这就造成了浪费资源,消耗性能。
总结:
kafka是发布订阅模式里面的:消费者主动从MQ拉取数据的模式。。。