为什么要使用消息系统
目的如下:
解耦
冗余:业务执行失败后,消息不会从队列中删除,直到被确认处理完毕。
扩展:因为解耦了处理过程,扩展增加消费节点,就很容易了。
削峰:突发流量不常遇到,关键时刻使用消息队列能顶住突发访问压力。
可恢复:和扩展相反,有消费节点挂了,也不会影响整个系统,恢复后正常处理。
顺序
异步:用户把消息放入队列,不立即处理,需要的时候在处理。
kafka基本组成
Kafka集群有若干个Broker组成,Topic 由若干个Partition组成。
Broker可以认为一台Kafka服务器就是一个Broker,Broker之间没有主从的概念,他们之间是平等的。
topic用户只需指定消息的主题topic 即可生产或消费数据不需关系数据存放何处
partition 一个非常大的topic可以被分为多个partition,从而分布到多台Broker上。Partition中的每条消息都会被分配一个Offset。Kafka只保证按一个partition中的顺序将消息发给消费者,但是不保证单个topic中的多个Partition之间的顺序。
Offset 消息在topic的Partition中的位置,同一个Partition中的消息随着消息的写入,其对应的Offset也自增。
replica副本。Topic的Partition含有N个Replica,N为副本因子。其中一个Replica为Leader,其他都为Follower,Leader处理Partition的所有读写请求,与此同时,Follower会定期地去同步Leader上的数据。
producer消息生产者,即将消息发布到指定的Topic中,同时Producer也能决定此消息所属的Partition:比如基于Round-Robin(轮询)方式或者Hash(哈希)方式等一些算法。
consumer消息消费者,即向指定的Topic获取消息,根据指定Topic的分区索引及其对应分区上的消息偏移量来获取消息。
consumer group 消费者组,每个Consumer属于一个Consumer Group;反过来,每个Consumer Group中可以包含多个Consumer。如果所有的Consumer都具有相同的Consumer Group,那么消息将会在Consumer之间进行负载均衡。也就是说一个Partition中的消息只会被相同Consumer Group中的某个Consumer消费,每个Consumer Group消息消费是相互独立的。如果所有的Consumer都具有不同的Consumer Group,则消息将会被广播给所有的Consumer。