1、消息队列
简单地说,“消息队列”是在消息的传输过程中保存消息的容器。
1.1 简介
消息队列管理器在将消息从它的源中继到它的目标时充当中间人。队列的主要目的是提供路由并保证消息的传递;如果发送消息时接收者不可用,消息队列会保留消息,直到可以成功地传递它。
1.2 为什么要使用消息队列
主要原因是由于在高并发环境下,由于来不及同步处理,请求往往会发生堵塞,比如说,大量的insert,update之类的请求同时到达MySQL,直接导致无数的行锁表锁,甚至最后请求会堆积过多,从而触发too many connections错误。通过使用消息队列,我们可以异步处理请求,从而缓解系统的压力。
消息队列中间件是分布式系统中重要的组件,主要解决应用解耦、异步消息、流量削锋、消息通讯等问题,实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ。
2、Apache Kafka
Apache Kafka是由Apache软件基金会开发的一个开源消息系统项目,由Scala写成。Kafka最初是由LinkedIn开发,并于2011年初开源。2012年10月从Apache Incubator毕业。该项目的目标是为处理实时数据提供一个统一、高通量、低等待的平台。
Kafka是一个分布式的、分区的、多复本的日志提交服务。它通过一种独一无二的设计提供了一个消息系统的功能。
Kafka提供了类似于JMS的特性,但是在设计实现上完全不同,此外它并不是JMS规范的实现。kafka对消息保存时根据Topic进行归类,发送消息者成为Producer,消息接受者成为Consumer,此外kafka集群有多个kafka实例组成,每个实例(server)成为broker。无论是kafka集群,还是producer和consumer都依赖于zookeeper来保证系统可用性集群保存一些meta信息。
Kafka系统示意图
2.1 Kafka相关概念简介
- Kafka维护按类区分的消息,称为主题(topic)。
- 生产者(producer)向kafka的主题发布消息。
- 消费者(consumer)向主题注册,并且接收发布到这些主题的消息。
- kafka以一个拥有一台或多台服务器的集群运行着,每一台服务器称为broker。
从高层来说,生产者(producer)通过网络发消息到kafka集群,而kafka集群则以下面这种方式对消费者进行服务。
2.2 Kafka消息机制简介
传统的消息系统有两种模型:队列和发布-订阅模式。在队列模型中,一堆消费者会从一台机子上读消息,每一条消息只会被一个消费者读到;在发布订阅模型中,消息会向所有的消费者广播。Kafka提供了一种单一的将这两种模型进行抽象的消费者模式——消费者组(consumer group)。
消费者会属于某一个组,发布到每个主题的消息会递送给订阅了这个主题的消费者组中的一个消费者。消费者实例可以是不同的进程或者在不同的机器上。如果所有的消费者从属于同一个组,这就跟传统的队列模式一样了。如果每个消费者自成一组,那么这就是发布订阅模式了,所有的消息会被广播给所有的消费者。但是通常情况下,我们发现,主题会有多个消费者组,每个组对应一个逻辑上的订阅者,每个组由多个消费者实例组成以保证扩展性和容错性。
Kafka处理定序问题上也去传统的消息系统不一样。传统的队列允许消息被任何一个消费者实例所消费。这意味着消息的顺序丢失了。也就是说,尽管在队列中消息是有顺序的,但这些消息会到达不同的消费者并且被无序地处理。在Kafka里,因为有并行的概念——分区,Kafka可以同时提供顺序保证和负载均衡。这可以通过将主题中的分区分配给消费者组中的消费者来实现,这样的话每个分区只被这个组中的一个消费者所消费。这样我们还可以保证这个消费者是这个分区的唯一消费者,并且是按原来的顺序来处理数据的。因为有许多分区,所以也就可以在多个消费者实例中实现负载均衡。需要注意的是,消费者实例的数量不可能比分区多。
网友评论