Java中的消息是基于内存的
消息中间件使用场景:
异步:用户登录的时候,将用户信息写入数据库,发邮件给用户、发短信给用户,需要150ms,改为异步,将信息写入数据库,然后写入消息队列,使用55ms,再从消息队列异步读取发送邮件和短信
削峰:比如秒杀系统,用户请求写入消息队列,然后秒杀业务根据规则读取秒杀请求(前端流量控制)
解耦:比如订单系统和库存系统,每次下订单之后,需要调用库存系统来加减库存,但是订单系统本来穿3个参数,后来改成5个参数,库存系统也需要跟着修改,因此可以放入消息队列中,读取相关信息,后台系统无需跟着改造。
Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域
消息队列的两种模式:
点对点模式(一对一,消费者主动拉取数据,消息收到后消息清除):
发布/订阅模式(一对多,消费者消费数据之后不会清除消息):
消费者主动拉取(kafka):缺点:浪费资源,因为维护了一个长轮询,去查看是否有消息
生产者推送两种模式
同一个消费分区里的消息,只能被同一个消费者组的一个消费者消费(A消费了,B就不能消费,AB属于同一个消费者组,避免重复消费)
消费者组是为了提高消费效率
kafka 的消息存在磁盘中,默认存7天
kafka架构
1)Producer :消息生产者,就是向 kafka broker 发消息的客户端;
2)Consumer :消息消费者,向 kafka broker 取消息的客户端;
3)Consumer Group (CG):消费者组,由多个 consumer 组成。消费者组内每个消费者负 责消费不同分区的数据,一个分区只能由一个组内消费者消费;消费者组之间互不影响。所 有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
4)Broker :一台 kafka 服务器就是一个 broker。一个集群由多个 broker 组成。一个 broker 可以容纳多个 topic。
5)Topic :可以理解为一个队列,生产者和消费者面向的都是一个 topic;
6)Partition:为了实现扩展性,一个非常大的 topic 可以分布到多个 broker(即服务器)上, 一个 topic 可以分为多个 partition,每个 partition 是一个有序的队列;
7)Replica:副本,为保证集群中的某个节点发生故障时,该节点上的 partition 数据不丢失,且 kafka 仍然能够继续工作,kafka 提供了副本机制,一个 topic 的每个分区都有若干个副本, 一个 leader 和若干个 follower。
8)leader:每个分区多个副本的“主”,生产者发送数据的对象,以及消费者消费数据的对 象都是 leader。
9)follower:每个分区多个副本中的“从”,实时从 leader 中同步数据,保持和 leader 数据 的同步。leader 发生故障时,某个 follower 会成为新的 leader。
8)offset:偏移量:0.9版本之前offset存储在ZK,0.9版本之后offset存储在本地,用于记录消费位置,放止挂掉之后,找不到在哪里消费
Kafka通过zookeeper存储集群的meta信息