消息队列简介
Posted codeHorde
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了消息队列简介相关的知识,希望对你有一定的参考价值。
消息队列:一个是消息,一个是队列。如果只是消息,像我们直接发送socket,就可以称为消息了,但是中间加了一个队列,相当于多了一个中间层,就可以在特定的场景下发挥其作用了。消息队列主要使用场景:服务之间解耦。也正因为有了个中间层,相当于一个容器可以缓冲流量,所以说消息队列也经常用于缓冲流量,协调发送方和接收方的速率,保证系统的稳定性。
说道消息队列,最重要的肯定是消息了,双方通信,必须按照一定的格式进行,才能正常通信吗,就像语言也有其语法。消息协议听得最多的就是AMQP协议了,其中不仅规定了消息的格式,还定义了几个组件。Message、Producer、Consumer、Exchange、Queue。
要保证消息的必达性和幂等性,就需要各种实现的AMOP协议的消息队列有这些特性。保证必达性:必须消息能持久化,生产者和服务端,服务端和消费端要具有消息重传,确认机制。消息幂等性需要由发送方生产全局唯一ID来保证幂等性。下面介绍两种常用的消息队列ActiveMQ、Kafka。
ActiveMQ有两种工作机制:Queue和Topic。Topic队列基于订阅-发布模式,相对于Exchange会对消息分发到所有队列中;Queue是一个消息只能被一个消费者介绍。
ActiveMQ中消息分为持久化消息和非持久化消息。生成者也可以异步发送消息,但是可能会出现消息堆积,非持久化消息出现内存堆积后,会转储到Temp Store区域,产生堆积后服务端会通知生成者放慢速度。异步也并不是完全异步,生产者会在消息累积发送达到一定阈值的时候,确认是否累积,并减慢速度。
为了保证消息的可达性,需要保证重发确认机制,但是这会影响消息队列的性能,所以批量确认可以提高消息队列的性能。生产者异步发送,达到一定量的时候确认一次;消息者批量接收,达到一定量的时候确认一次
事务消息:生产者启动事务,在commit之前不会进行队列,防止transaction store中,并记录redo日志。消息者启动事务,rollback之后服务器会再次发送, 可以配置重发次数。
ActiveMQ覆盖了事务机制、确认机制、重试机制和热备机制来保证消息完整可达。还有一些专门为数据吞吐性能场景的消息队列。比如kafka.
kafka由于支持海量数据的吞吐性能,不支持事务性。适合单位时间内大量的数据采集工作的场景(丢失一两条数据也可以)。
kafka包括生产者、消费者、broker、zookeeper。消息队列记为topic,一个topic拆为多个分区,这些分区存于多个Broker,为了保证高可用,分区有多个副本,分区里面是segement。一条消息只会分配到一个分区进行存储。生产者不和zookeeper进行交流。生产者指定分区
消息者:按组进行消息隔离。一个分区中的消息只能被同一组下的某一个消费者处理。保证一个分区下消息队列有序。
zookeepr:协调者,记录当前集群状态,topic以及分区情况,消费者组消费者,每一个消费者对应topic的索引位置。
以上是关于消息队列简介的主要内容,如果未能解决你的问题,请参考以下文章