消息队列简介
消息队列在高并发的应用场景中,由于来不及同步处理请求,接收到的请求往往会发生阻塞。例如,大量的插入、更新请求同时到达数据库,这会导致行或表被锁住,最后会因为请求堆积过多而触发“连接数过多的异常”(TooMany Connections)错误。
因此,在高并发的应用场景中需要一个缓冲机制,而消息队列则可以很好地充当这样一个角色。消息队列通过异步处理请求来缓解系统的压力。
“消息队列”(Message Queue, MQ)从字面来理解,是一个队列,拥有先进先出(First Input First Output, FIFO)的特性。它主要用于不同进程或线程之间的通信,用来处理一系列的输入请求。消息队列采用异步通信机制。
即,消息的发送者和接收者无须同时与消息队列进行数据交互,消息会一直保存在队列中,直至被接收者读取。每一条消息记录都包含详细的数据说明,包括数据产生的时间、数据类型、特定的输入参数。
Kafka的起源与特点
Kafka起源于LinkedIn公司。起初,LinkedIn需要收集各个业务系统和应用的指标数据来进行数据分析,原先是使用“自定义开发”系统来实现的。但这期间需要采集的数据量非常大,且内容很复杂。除要采集操作系统的基础指标(例如:内存、CPU、磁盘、网络等)外,还要采集很多和业务相关的数据指标。
随着数据量的增长、业务需求的复杂度提高,这个“自定义开发”系统的问题也越来越多。例如,在处理一个HTTP请求数据时,由于数据内容是以XML数据格式进行传输的,需要先对这部分数据做解析处理,然后才能拿来做离线分析。由于这样一个自定义开发系统不够稳定,且XML数据格式的解析过程也非常复杂,所以系统经常出现问题。出现问题后,定位分析也比较麻烦,需要很长的处理时间,所以无法做到实时服务。之后,LinkedIn想寻找一种可支持大数据实时服务并且支持水平扩展的解决方案。尝试过使用ActiveMQ,但是它不支持水平扩展,并且ActiveMQ内部有很多Bug。
于是,LinkedIn团队开发了一个既满足实时处理需求,又可支持水平拓展的消息系统——Kafka,它还拥有高吞吐量特性。2010年,Kafka项目被托管到Github开源社区。一时间,大量开发者被这个项目所吸引。2011年,Kafka成为Apache项目基金会的一个开源项目。2012年,Apache项目基金会开始对Kafka项目进行孵化。之后,不断有LinkedIn员工和社区成员来维护和改善Kafka项目,Kafka项目得到持续不断地改进。如今,Kafka项目成为Apache项目基金会的顶级项目之一。
Kafka作为一个消息队列系统,其核心机制就是生产消息和消费消息。在Kafka基本结构中,生产者(Producer)组件和消费者(Consumer)组件互不影响,但又是必须存在的。缺少生产者和消费者中的任意一方,整个Kafka消息队列系统将是不完整的。
· 生产者(Producer)负责写入消息数据。将审计日志、服务日志、数据库、移动App日志,以及其他类型的日志主动推送到Kafka集群进行存储。·
- 消费者(Consumer)负责读取消息数据。例如,通过Hadoop的应用接口、Spark的应用接口、Storm的应用接口、ElasticSearch的应用接口,以及其他自定义服务的应用接口,主动拉取Kafka集群中的消息数据。
另外,Kafka是一个分布式系统,用Zookeeper来管理、协调Kafka集群的各个代理(Broker)节点。当Kafka集群中新添加了一个代理节点,或者某一台代理节点出现故障时,Zookeeper服务将会通知生产者应用程序和消费者应用程序去其他的正常代理节点读写。
领取专属 10元无门槛券
私享最新 技术干货