甲乙小朋友的房子

甲乙小朋友很笨,但甲乙小朋友不会放弃

0%

OpenMessaging简介

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::PullConsumerPushConsumerStreamConsumer.每种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无关

参考文献

  1. 原始文档
  2. pugwoo用c写的
  3. 原始文档扒的API