1.1 什么是消息系统
一般我们把消息的发送者称为生产者(Producer),消息的接收者称为消费者(Consumer);通常生产者的生产速度和消费者的消费速度是不相等的;如果两个程序始终保持同步沟通,则势必会有一方存在空等时间;如果两个程序持续运行,则消费者的平均速度一定要大于生产者的平均速度,否则消息囤积会越来越多;当然,如果消费者没有时效性需求,也可以把消息囤积在消息系统中,集中对其进行消费。
说到这里,我们再来谈谈队列的分类,根据生产者和消费者的作用范围不同,可以把消息系统分为三类。
(1)第一类是在一个应用程序内部(进程之间或线程之间),相信大家学习多线程时都写过生产者程序和消费者程序,生产者负责生产,将生产的结果放到缓冲区(如共享数组),消费者从缓冲区取出消费,在这里,这个缓冲区就可以称为“消息系统”或“消息队列”。
(2)第二类其实也算是第一类的特例,就像我们喜欢把操作系统和应用程序区别对待来看,操作系统要处理无数繁杂的事物,各进程、线程之间的数据交换少不了消息系统的支持。
(3)第三类是通用意义上的“消息系统”,这类系统主要作用于不同的应用,特别是跨机器、平台,这令数据的交换更加广泛,一般一款独立的消息系统除了实现消息的传递,还提供了相应的可靠性、事务、分布式等特性,将生产者、消费者从中解耦。常见的消费系统产品根据开源与否可分为两类。
• 商业的专用软件:Oracle WebLogic、IBM WebSphere MQ等。
• 开源的软件:ActiveMQ、RabbitMQ、Apache Kafka等。
在了解了消息系统的基本概念后,我们通过下面的例子来说明一个消息系统的典型应用架构,如图1.1所示。
图1.1 一个典型的消息系统应用
在这个例子中,以一个银行系统为例,当我们在电商网站上进行消费或从银行的ATM机上取钱时,银行的消息系统都会发送消息通知我们。这时候,我们就可以把电商网站和ATM机看成银行消息系统的消息生产者,当我们消费了银行账户的存款,生产者就会产生一个消息发送到银行的消息系统中,并由该消息系统进行处理,从而通过不同的方式通知我们,例如,短信、邮件或其他方式。我们就可以把这些通知的方式看成银行消息系统的消息消费者,它们负责接收由消息系统转发处理的消息。
一个消息系统的基本组成包括:消息生产者、消息消费者和消息服务器(Broker)。关于它们的具体作用,我们会在后续的章节介绍Kafka的体系架构时,再进行详细说明。