0 Java消息服务(Java Message Service,JMS)

Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。Java消息服务是一个与具体平台无关的API,绝大多数MOM提供商都对JMS提供支持。

Java消息服务的规范包括两种消息模式,点对点和发布者/订阅者。许多提供商支持这一通用框架因此,程序员可以在他们的分布式软件中实现面向消息的操作,这些操作将具有不同面向消息中间件产品的可移植性。

Java消息服务支持同步和异步的消息处理,在某些场景下,同步消息是必要的;
在其他场景下,异步消息比同步消息操作更加便利。

Java消息服务支持面向事件的方法接收消息,事件驱动的程序设计现在被广泛认为是一种富有成效的程序设计范例,程序员们都相当熟悉。

在应用系统开发时,Java消息服务可以推迟选择面对消息中间件产品,也可以在不同的面对消息中间件切换。

消息生产者生产消息发送到queue中,然后消息消费者从queue中取出并且消费消息。这里要注意:
消息被消费以后,queue中不再有存储,所以消息消费者不可能消费到已经被消费的消息。
Queue支持存在多个消费者,但是对一个消息而言,只会有一个消费者可以消费。
发布/订阅
消息生产者(发布)将消息发布到topic中,同时有多个消息消费者(订阅)消费该消息。和点对点方式不同,发布到topic的消息会被所有订阅者消费。

历史

Java消息服务是一个在 Java标准化组织(JCP)内开发的标准(代号JSR 914)。2001年6月25日,Java消息服务发布JMS 1.0.2b,2002年3月18日Java消息服务发布 1.1,统一了消息域.

体系架构

JMS由以下元素组成。

  • JMS提供者
    连接面向消息中间件的,JMS接口的一个实现。提供者可以是Java平台的JMS实现,也可以是非Java平台的面向消息中间件的适配器。
  • JMS客户
    生产或消费消息的基于Java的应用程序或对象。
  • JMS生产者
    创建并发送消息的JMS客户。
  • JMS消费者
    接收消息的JMS客户。
  • JMS消息
    包括可以在JMS客户之间传递的数据的对象
  • JMS队列
    一个容纳那些被发送的等待阅读的消息的区域。队列暗示,这些消息将按照顺序发送。一旦一个消息被阅读,该消息将被从队列中移走。
  • JMS主题
    一种支持发送消息给多个订阅者的机制。

1 Kafka 基础

1.1 简介

Kafka是由Apache软件基金会开发的一个开源流处理平台,由Scala和Java编写。该项目的目标是为处理实时数据提供一个统一、高吞吐、低延迟的平台。其持久化层本质上是一个“按照分布式事务日志架构的大规模发布/订阅消息队列”,这使它作为企业级基础设施来处理流式数据非常有价值。此外,Kafka可以通过Kafka Connect连接到外部系统(用于数据输入/输出),并提供了Kafka Streams——一个Java流式处理库。

1.2 历史

Kafka最初是由领英开发,并随后于2011年初开源,并于2012年10月23日由Apache Incubator孵化出站。2014年11月,几个曾在领英为Kafka工作的工程师,创建了名为Confluent的新公司,并着眼于Kafka。根据2014年Quora的帖子,Jay Kreps似乎已经将它以作家弗朗茨·卡夫卡命名。Kreps选择将该系统以一个作家命名是因为,它是“一个用于优化写作的系统”,而且他很喜欢卡夫卡的作品

1.1 消息系统

1.1.1 点对点或队列模型(point to point, queue)

一个生产者向一个特定的队列发布消息,一个消费者从该队列中读取消息.
这里,生产者知道消费者的队列,并直接将消息发送到消费者的队列.

  • 只有一个消费者将获得消息
  • 生产者不需要在接收者消费该消息期间处于运行状态,接收者也同样不需要在消息发送时处于运行状态
  • 每一个成功处理的消息都由接收者签收

1.1.2 发布/订阅模型(publish/subscribe,topic)

支持向一个特定的消息主题发布消息;
0或多个订阅者可能对接收来自特定消息主题的消息感兴趣;
在这种模型下,发布者和订阅者彼此不知道对方;
这种模式好比是匿名公告板

  • 多个消费者可以获得消息
  • 在发布者和订阅者之间存在时间依赖性。发布者需要创建一个订阅(subscription),以便客户能够购订阅。订阅者必须保持持续的活动状态以接收消息,除非订阅者创建了持久的订阅。在那种情况下,在订阅者未连接时发布的消息将在订阅者重新连接时重新发布。

1.2 Kafka术语

Kafka存储的消息来自任意多被称为“生产者”(Producer)的进程;
数据从而可以被分配到不同的“分区”(Partition)、不同的“Topic”下.

在一个分区内,这些消息被索引并连同时间戳存储在一起。其它被称为“消费者”(Consumer)的进程可以从分区查询消息。Kafka运行在一个由一台或多台服务器组成的集群上,并且分区可以跨集群结点分布。

Kafka高效地处理实时流式数据,可以实现与Storm、HBase和Spark的集成。作为群集部署到多台服务器上,Kafka处理它所有的发布和订阅消息系统使用了四个API,即生产者API、消费者API、Stream API和Connector API。它能够传递大规模流式消息,自带容错功能,已经取代了一些传统消息系统,如JMS、AMQP等。

Kafka架构的主要术语包括Topic、Record和Broker。Topic由Record组成,Record持有不同的信息,而Broker则负责复制消息。Kafka有四个主要API:

  • 生产者API:支持应用程序发布Record流。
  • 消费者API:支持应用程序订阅Topic和处理Record流。
  • Stream API:将输入流转换为输出流,并产生结果。
  • Connector API:执行可重用的生产者和消费者API,可将Topic链接到现有应用程序。

2 Kafka 的安装与使用(单机版)

2.1 安装Kafka

2.1.1 官网下载一个需要的(最新的)版本

2.1.2 解压

  • tar -zxvf kafka_2.11-2.1.1.tgz

2.1.3 修改配置文件

  • vim config/server.properties
  • broker.id 设置为1
  • 修改 log.dirs 路径

2.1.4 使用(进入到 kafka 的根目录下)

  • 启动 zookeeper
    bin/zookeeper-server-start.sh -daemon config/zookeeper.properties

    说明 zk 启动成功
  • 启动 kafka
    bin/kafka-server-start.sh config/server.properties

  • 创建 topic
    bin/kafka-topics.sh --create --zookeeper localhost:2181 --replication-factor 1 --partitions 1 --topic javaedge_ad_test_x
  • 显示已有 topic
    bin/kafka-topics.sh --list --zookeeper localhost:2181
  • 写消息,开启生产者
    bin/kafka-console-producer.sh --broker-list localhost:9092 --topic javaedge_ad_test_x

    另启一个终端
  • 读消息,开启消费者
    bin/kafka-console-consumer.sh --bootstrap-server localhost:9092 --topic javaedge_ad_test_x --from-beginning

生产者端生成消息
生产者端收到消息

  • 查看 topic 详情