其实在学校学习过程中没有接触过消息队列处理的的相关内容,这一次在字节课程中了解了工业界比较成熟的消息队列的底层原理、架构设计和一些高级特性,并终于认识了听过很多次的Kafka,真的是受益匪浅,消息队列中的一些高级特性对处理其他高并发的事情都有借鉴意义。下面开始介绍相关的一些知识啦。
消息队列(MQ)
消息队列(MQ),指保存消息的一个容器,本质是个队列。但这个队列需要支持高吞吐、高并发和高可用。消息队列用于解决因同一时段的消息过多、过大而导致的互联网场景包含:系统崩溃、服务处理能力有限、链路耗时长尾、日志如何处理……
业界消息队列对比
- Kafka:分布式的、分区多副本的日志提交服务,在高吞吐场景下发挥较为出色。
- RocketMQ:低延迟、强一致、高性能、高可靠、万亿级容量和灵活的可扩展性,在一些实施场景中运用较广。
- Pulsar:是下一代云原生分布式消息流平台,集消存储、轻量化函数计算为一体、采用存算分离的架构设计。
- BMQ:和Pular架构类似,存算分离,初期定位是承接高吞吐的离线业务场景,逐步替换掉对应的Kafka集群。
Kafka
Kafka常用于在搜索服务、直播服务、订单服务、支付服务等等中的日志信息、Metrics数据和用户行为等数据的高并发处理中。
如何使用Kafka
- 首先要创建一个Kafak集群。
- 需要在这个集群中创建一个Topic,并且设置好分片数量。
- 引入对应语言的SDK,配置好集群和Topic等参数,初始化一个生产者,调用Send方法将一个Hello World消息发送出去
- 引入对应语言的SDK,配置好集群和Topic等参数,初始化一个消费者,调用Pull方法将收到刚才发的Hello World消息。
基本概念解释如下:
- Topic:Kafka中的逻辑队列,每一个不同的业务场景就是一个不同的Topic,这个业务的所有数据都存储在这个Topic中。
- Cluster:Kafka的物理集群,每个集群中可以创建多个不同的Topic。
- Producer:消息的生产端,负责将业务消息发送到Topic中。
- Consumer:消息的消费端,负责消费已发送到Topic中的消息。
- Partition:通常Topic会有多个分片,不同的分片直接消息可以并发处理,这样可以提高单个Topic的吞吐。
Kafka中的高级特性和存在的问题
- 帮助Kafka提高吞吐或者稳定性的功能
- Producer:批量发送、数据压缩 -Broker:顺序写、消息索引、零拷贝 -Consumer:Rebalance
- Kafak存在的问题
- 运维成本高
- 杜宇负载不均衡的场景,解决方案复杂
- 没有自己的缓存,完全依赖于Page Cache
- Controller和Cooidinator和Broker在同一进程中,大量的IO会造成性能下降。