在平常的开发工作中,大家或多或少的会用到消息中间件。可能是为了解除循环依赖,可能是为了削峰填谷。不管怎么样,消息中间件已经成为开发架构中不可缺少的重要组成部分。
消息中间件有很多选型,包括RabbitMq/RocketMq/ActiveMq/Kafka/。这个系列是主要总结一下胡希老师在极客时间的Kafka核心技术与实践课程。大家像购买的话可以扫描最下方的二维码。
Kafka是什么?
- Kafka是一个消息引擎,提供消息传递功能。
- Kafka是一个实时流处理引擎,提供实时的流处理能力。
消息引擎
大家习惯把Mq系统叫做消息中间件,是因为在系统架构中,他们承担的角色是业务处理的中间消息传递系统,所以叫消息中间件无可厚非,但是脱离系统整理架构,我们仔细看Kafka,他其实是一个Message System。wiki上对消息引擎的定义如下:
消息引擎是一组规范,企业用这种规范传递语义准确的消息,实现松耦合的异步消息传递。
普通解释:A把消息(record)传递给消息引擎,B从消息引擎获取record。可以把这句话分成两个部分:
- 传递的是消息
- 消息引擎制定了消息传递的协议规范
消息(record)
语义准确,每个公司的mq消息都不是随便定义的,而是遵从一定的规则,使用相对规范的格式(xml/json)组织消息。
传递协议
消息传递协议
- 点对点模式(peer to peer),例如电话服务,只能从A到B,C不能接收到A的服务
- 发布/订阅模式(pub/sub),例如报纸订阅,只要订阅了报纸,A/B/C都能收到报纸。消息发布者:publisher。消息订阅者:subscriber
消息引擎的作用
削峰填谷
高TPS环境(秒杀),瞬时访问量会非常大,平时可以正常提供服务的系统可能难以支撑如此打的访问量,为了避免大规模的系统崩溃,我们选用消息引擎缓存访问申请,让业务服务器订阅消费,就像是大坝的工作一样,拦截洪峰,缓慢的输送到下游。
打破循环依赖
还有一种情况,在分布式框架中,多系统协调服务可能会出现循环依赖的问题,A服务依赖B服务,B服务又依赖A服务。这样的情况下,B和A的之间添加消息中间件,解除依赖
缓存
极少情况下,大神这么做
Kafka的组件:
- Record:消息
- Broker(server):消息引擎服务器,存储消息,备份,持久化
- Publisher:消息生产者
- Subscriber: 消息订阅者
- Clients:客户端,生产者和消费者都是客户端
- Topic: 消息主题,可以根据业务分类
- Partition:分区,一个消息主题可能有大量的消息存在,为了横向扩展,采用分区的概念
- Leader Partition:对应Follower Partition,主分区-副分区,主分区主要接受客户端的写入和消费请求,副分区不做请求处理,只请求主分区,请主分区把消息同步到副分区
- Log segment: 日志段,持久化使用,把对消息的读写和消费操作记录到日志文件,日志文件可以切分为多个文件,一个写满了新建一个日志文件。继续写入
- 消费者组:多个消费者同时消费同一个主题的消息,A消息只能被组内的消费者消费一次,如果消费者0下线,那么可以剩余的消息可以rebalance到其他的消费者。
- 消息位移:消息在分区当中的位置信息
- 消费者位移:消费者已经消费到哪个消息的位置信息
以上就是Kafka的主要概览,有兴趣的同学可以扫面下方二维码查看详情。