OpenMessaging的主要关系如下图所示:
其中,各部分的内容和关系见下述。
Namespace
Namespace就像一个cgroup namespace,是用来创建一个有安全保障的独立的空间。每个namespace都有自己的producer,consumer,topic,queue等等。OpenMessaging用 MessagingAccessPoint(消息访问点)来访问/读/写指定namespace的资源。
Producer
Openmessaging定义了两种Producer:Producer和 SequenceProducer
- Producer:提供各种send方法,用来将一个消息送往指定的destination,Topic或者Queue。支持三种方式:同步、异步、单向(oneway)
- SequenceProducer:重点在于速度,且支持批处理。能发送多个数据并一次提交。
Consumer
Openmessaging定义了两种Consumer::PullConsumer、PushConsumer和StreamConsumer.每种Consumer仅支持来自于Queue的consume消息。
- PullConsumer:从指定队列中pulls消息。支持“submit the consume result by acknowledgement at any time”。每个PullConsumer仅能从固定的队列中pull消息。
- PushConsumer:可从多个队列中接收消息,且这个消息是由MOM server push上去的。PushConsumer可依附于多个独立的、具有不同的MessageListener的队列,并且可以随时通过ReceivedMessageContext提交结果。
- StreamingConsumer:一种崭新的consumer类型,是一种面向流的consumer,面向留信息的一体化信息系统。
Topic Queue and Routing
这三个概念非常相近。虽然Topic和Queue有不同的用途,但它们总让人迷惑。
Topic
Topic是原始信息的载体,用来holding消息。消息的分发方式和有序性是没有定义的。
Routing
Topic中的消息是原始的,是待处理的,一般不易引起consumers的注意。总之,Topic中的数据是producer-orented(导向)的,而不是consumer-oriented。
因此Routing负责加工Topic中的原始消息,并routing去Queue中。每个Routing有一个操作管线(operator pipeline),包含着一系列的操作。消息会通过操作管线从Topic流向Queue。
操作(operator)是用来处理在Routing流通的消息的。有很多操作,例如expression operator, deduplicator operator, joiner operator, filter operator, rpc operator等等。
Queue(队列)
现在消息已经被routed到Queue中了。现在消息就可以被consumers使用了。
需要注意的是,一个Queue可能会被分为几部分,消息可能通过MessageHeader#SHARDING_KEY被routed到某个特殊的部分中。
Topic与Queue比较
- 都是消息的载体
- Topic是preducer-oriented的,而Queue是consumer-oriented的
- Topic中的消息来自于Producer,而Queue中的消息来自于Topic或者Producer
- Queue包含几个部分,而Topic形状未定义
- 在大多数情况下,Queue是Topic的一个子集
- Queue的创建、销毁都很容易,且与producer无关