本篇是消息队列中的一节,为何讲到消息队列见:https://segmentfault.com/a/11...。其中流处理的数据传播用到消息队列。另外消息队列还能够做用于异步处理,流量削峰,多系统同步等。另外一篇介绍了传统的JMS(activemq),AMQP(rabbitmq),本篇介绍kafka,robbitmq,ddmq,另外简单说下bridgemq以及常见mq的综合对比。同其余系统同样,终点关注架构组件,功能(生产消费等),分布式的高可用,扩展性,一致性等linux
官方:发布订阅,流处理管道和存储
https://kafka.apache.org/docu...redis
https://kafka.apache.org/docu...apache
1) Producer端使用zookeeper用来"发现"broker列表,以及和Topic下每一个partition leader创建socket链接并发送消息.
2) Broker端使用zookeeper用来注册broker信息,以及监测partition leader存活性.全部的Kafka Broker节点一块儿去Zookeeper上注册一个临时节点,成功的为Broker controller,失效后zk后发现从新注册节点,controller负责各broker内partition的选主(ISR中,记录replica进度,随便选)ISR,在这个集合中的节点都是和leader保持高度一致的,任何一条消息必须被这个集合中的每一个节点读取并追加到日志中了,才回通知外部这个消息已经被提交了。所以这个集合中的任何一个节点随时均可以被选为leader.若是ISR的大小超过某个最小值,则分区将仅接受写入,以防止丢失仅写入单个副本的消息(只关注ISR,而不是共识多个都写入,多数(两个故障须要5个副本,一个要三个)对于主数据的写代价大)【与ES相似都使用的Microsoft的PacificA】
3) Consumer端使用zookeeper用来注册consumer信息,其中包括consumer消费的partition列表等,同时也用来发现broker列表,并和partition leader创建socket链接,并获取消息。
broker,partition,customer组内线程可扩展。json
只保证一个partition被一个customer消费有序
producter推,customer拉(拉须要存日志)
partition中的每一个message只能被组(Consumer group )中的一个consumer(consumer 线程)消费,若多个同时要配多个Consumer group。
kafka中的消息是批量(一般以消息的条数或者chunk的尺寸为单位)发送给consumer,当消息被consumer接收以后,负责维护消息的消费记录(JMS等都是broker维护),consumer能够在本地保存最后消息的offset,并间歇性的向zookeeper注册offset.也没有ACK
消息消费的可靠性,消费者控制,最多一次,先保存offset再处理;至少一次,先处理再保存offset;只一次:最少1次+消费者的输出中额外增长已处理消息最大编号segmentfault
确保有每一个分区数据日志中每一个key有最后已知值,offset不能变。对同一partition的多个文件一块儿压缩合并。
position是文件的bytes偏移吧?压缩过程当中要重建索引和位置?【我的理解是要重建的】
active不动(不影响写入),对cleaner point后面的作压缩,选择日志tail和header比例小的,合并压缩每组log不超过1G,index不超过10M。
对于tail的压缩过程:【position不变???我的理解这是错误的,position是变得】
每一个日志清理线程会使用一个名为“SkimpyOffsetMap”的对象来构建key与offset的映射关系的哈希表。日志清理须要遍历两第二天志文件,第一次遍历把每一个key的哈希值和最后出现的offset都保存在SkimpyOffsetMap中,映射模型以下图所示。第二次遍历检查每一个消息是否符合保留条件,若是符合就保留下来,不然就会被清理掉服务器
activemq 不能分片。kafka性能(上面知道基本上partition和consumer须要配置同样的,一个consumer group的线程数和partition数量一致,受partition限制,rocketmq多partition的扩展在于都用一个commitlog,而不是一个partition单独一份顺序log,对于磁盘多个文件是随机写入的,随机高性能很差不能linux组提交,cq只存储位置,在commitlog中找数据,一份彻底顺序的写入提升性能。对于消费顺序和kafka都是同样的保证,cq都是负载均衡,只保证一个cq顺序。在消费时,须要先读取cq上个的offset再读commitlog。http://rocketmq.apache.org/ro...)架构
每一个commmit log消息发给topic的随机queue中(生产者的负载均衡,每一个msg只发送到一个q中),每一个queue有不少consumequeue,发给全部。广播模式,cq会在全部q上,集群模式cq会负载均衡到某个q上,消息根据这些配置数据落到q的全部cq上。并发
内存。redis实现。适合小型系统负载均衡
这里的kafka去掉了。普通的直接用哪一个rocketmq.延时消息和事务消息异步
分析:少topic时kafka性能好,rockemq须要读mq后去读一个大的cl。多topic是rockemq好,处理线程多。