我正在尝试使用Kafka作为消息总线在Spring XD(1.2.1)中设置一些流和点击并遇到一些问题。
出于测试目的,我已经建立了一个带有管理节点和两个容器节点的Spring XD集群(虽然在生产中我们可能需要至少3个容器节点)。
理想情况下,我们还希望将所有模块部署到所有容器以实现负载平衡和故障转移目的,但由于模块。*。count = 0不能与Kafka消息总线一起使用我通过定义模块计数手动执行此操作每个模块2个。
我们想要创建的流将数据从源发送到接收器,并另外将其发送到多个计数器。
为了测试我正在使用http - >文件流。
首先我创建了
stream create httpfiletest --definition "http | file"
并使用
进行部署module.http.count=2,module.file.count=2
这会在每个容器上创建两个模块,当我通过它传递消息时,正确地将消息发送到其中一个容器计算机上的一个文件输出。
然后我创建了
stream create --name httpfiletesttap --definition "tap:stream:httpfiletest1 > transform | counter --name=httpfiletestcount"
当我在没有部署属性的情况下部署它时,它会按预期创建单个转换和计数器模块,并正确计算流过的消息。
但是如果我用
部署它module.transform.count=2,module.counter.count=2
(即2个转换和2个计数器模块,每个节点一个)每条消息都被计算两次。
这是一个错误吗?它看起来像https://jira.spring.io/browse/XD-3100虽然我认为这是用Rabbit作为消息总线并且它已经关闭 - 这是否可能这仍然发生在Kafka作为消息总线?
在Kafka上创建了流动的主题:
Partitions Brokers
httpfiletest.0 2 2
httpfiletesttap.0 2 2
SpringXdOffsets 1 1
tap_3Astream_3Ahttpfiletest.http.0 1 1
tap_3Astream_3Ahttpfiletesttap.transform.0 1 1
分区的差异是否与此相关?
作为使用水龙头的替代方案,我尝试使用命名通道,即
stream create httptotopic --definition "http > topic:mytopic"
stream create topictofile --definition "topic:mytopic > file"
stream create topictocounter1 --definition "topic:mytopic > counter --name=counter1"
stream create topictocounter2 --definition "topic:mytopic > counter --name=counter2"
再次部署了模块计数为2的所有内容。这不仅在计数器中提供了重复的消息,而且在文件输出中也是如此(即我在每个容器的输出文件中都有一条消息。 有趣的是,如果我使用queue:myqueue,这似乎表现得完全相同。
在这些场景中,XD似乎只是在Kafka中创建了一个看起来像我想要的主题。
这里的预期行为是什么?理想情况下,我想要的是能够在命名通道和每个不同的消费者(即文件,计数器1和计数器2)上放置消息,即使在不同节点上存在多个实例,也可以获取该消息一次。 这可能吗?它应该是队列还是主题?
如果有更多关于流,点击和命名通道如何映射到Rabbit和Kafka上的队列/主题的文档,那将会很有用。我们正在尝试设计流以限制在消息总线中创建的队列/主题的数量,因此看起来第二种方法(主题而不是点击)在这方面会更好。