消息队列(message,queue)MQ:
- 解耦合。(无系统的侵入性)
- 提高系统的响应时间
分类:
点对点的。
消息生产者发布到queue中之后,然后消息消费者从queue中取出,并且消费消息
缺点:
消息被消费之后,queue中就不再存储,所以消息消费者不可能消费到已经被消费的消息。
queue支持多个消费者,但是对于一个消息而言,只会有一个消费者可以消费。不能再次消费
发布/订阅producter把消息发布到queue的topic中,同时有多个cunsumer消费。topic 是来管理一组消息的机构
消息队列比较:
RabbitMQ:支持的协议多,非常重量级消息队列,对路由(Routing),负载均衡(Load balance)或者数据持久化都有很好的支持。
ZeroMQ:号称最快的消息队列系统,尤其针对大吞吐量的需求场景,擅长的高级/复杂的队列,但是技术也复杂,并且只提供非持久
性的队列。
ActiveMQ:Apache下的一个子项,类似ZeroMQ,能够以代理人和点对点的技术实现队列 。JMS
Redis:是一个key-Value的NOSql数据库,但也支持MQ功能,数据量较小,性能优于RabbitMQ,数据超过10K就慢的无法忍受。
kafka:kafka(可作为实时内存技术的大数据的缓冲地带),不仅仅把消息放在不同topic中,而且把消息进行partition,可并行
处理,每个partition,对于consumer group中的 每个consumer。每个topic对应每个consumer group
kafka 是分布式发布-订阅的消息系统。 消息发布到mq中的topic,topic 允许n个consumer消费
持久化的方式是日志的方式;主要用于处理活跃的流式数据(实时性的)
同时为发布和订阅提供高吞吐量。据了解,Kafka 每秒可以生产约 25 万消息(50 MB),每秒处理 55 万消息(110 MB)。
可进行持久化操作。将消息持久化到磁盘,因此可用于批量消费,例如 ETL,以及实时应用程序。通过将数据持久化到硬盘以及
replication 防止数据丢失。分布式系统,易于向外扩展。所有的 producer、broker 和 consumer 都会有多个,均为分布式的。
无需停机即可扩展机器。
消息被处理的状态是在 consumer 端维护,而不是由 server 端维护。当失败时能自动平衡。支持 online 和 offline 的场景。
名词:
- Producer 特指消息的生产者
- Consumer 特指消息的消费者
- Consumer Group 消费者组,可以并行消费Topic中partition的消息
- Broker:缓存代理,Kafa 集群中的一台或多台服务器统称为 broker。
- Topic:特指 Kafka 处理的消息源(feeds of messages)的不同分类。
- Partition:Topic 物理上的分组,一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列。partition 中的每条消息都会被分配一个有序的 id(offset)。
- Message:消息,是通信的基本单位,每个 producer 可以向一个 topic(主题)发布一些消息。
- Producers:消息和数据生产者,向 Kafka 的一个 topic 发布消息的过程叫做 producers。
- Consumers:消息和数据消费者,订阅 topics 并处理其发布的消息的过程叫做 consumers。
问答:
kafka的partition 日志文件,里面保持哪些内容?- offset 对应类型:long
- MessageSize 对应类型:int32
- data 是message的具体内容
kafka 怎么快速定位到 consumer没有消费过的信息?比如consumer挂了?
这个问题,使用zk来解决的
kafka 为什么能保证访问速度?
kafka存储过程: 每个topic的每个partition对应一个日志文件,数据在日志文件中,采用追加的方式去存储,然而这种有序的线
性访问磁盘,很多时候会比随机访问内存快。。同时对每一个partition进行segement(分段),每一个partition 对应一个index.
文件。
写:把数据追加到日志文件中,读:从文件中读。。。读写操作 不会堵塞(追加,有序),线性访问磁盘。
采用一种非全文检索(full text)的索引方式(full text的索引文件太大,占用过多的磁盘),从而采用稀疏存储:每隔一定字
节的数据建立一条索引。每个partition对应一个index文件,如果没有命中索引,那么找id 之前的数据。(类似二分查找)
kafka consumer怎么知道需要去获取消息producer push消息到kafka的时候,同时被zookeeper watcher到,consumer 去pull message,pull完之后通知zookeeper,记录该信息
zookeeper 在kafka中的工作
- 协调分布式的主从结构
- 协调producer、consumer的之间的服务
- 负载均衡