为何使用消息系统
解耦: 消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口,允许你独立的扩展或修改两边的处理过程,确保遵守同样的接口约束。
冗余、
扩展性、 可恢复性、顺序保证、 缓冲、 异步通信、灵活性&峰值处理能力:使用消息队列能够使关键组件顶住突发的访问阿里,而不会因为突发的超负荷请求完全奔溃。
Kafka简单流程:
产生消息的前端属于Producer,把产生的消息push到Broker(及Broker),broker是kafka的核心,broker数量越多,集群吞吐量越高,各种Consumer包括Hadoop Cluster、Real-time Monitoring、数据仓库等从brokerpull数据
Broker、Partition、Producer、Consumer、ConsumerGroup
Topic:在逻辑上认为是一个queue,每条消费都必须指定Topic(及指明把这条消息放哪个queue里),为提高kafka吞吐率,物理上把Topic分为多个Partition,每个Partition在物理上对应一个文件夹,改文件夹下存储这个Partition的所有消息和索引文件。
每个日志文件都是一个log entrie序列,每个log entrie包含一个4字节整形数值,1字节的magic value,4个字节的CRC校验码,后跟N个字节的消息体。每条消息都有一个当前Partition下唯一的offset,指明这条消息的起始位置。
log entrie不是由一个文件构成,而是分成多个segment,每个segment以该segment第一条消息的offset命名。另外会有一个索引文件,指明了每个segment下包含的log entrie的offset范围。
每条消息都被append到该Partition中,属于顺序写磁盘,效率非常高。
kafka集群不会删除已被消费的消息,保留所有的消息,可基于时间或partition文件的大小定期删除。
同一Topic的一条消息只能被ConsumerGroup内的一个consumer消费,多个ConsumerGroup可同时消费这一消息。广播:每个consumer有一个独立的Group,单播:所有的Consumer在同一个Group里。