问题标签 [integration-patterns]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
java - 如何将 JMS 消息“复制”到 2 个目的地?
我要求客户端发送的单个 JMS 消息必须可靠地(仅一次)传递到两个系统。这两个系统没有启用 HA,所以我想出的最佳建议是:
创建客户端发布到的单个队列
设置两个“中间”队列
使用自定义的“DuplicatorMDB”,它将从客户端队列读取消息并将它们发布到同一事务中的两个队列。
有没有这样的现有功能?如果一个或两个后端系统出现故障,平衡系统以使其保持稳定的正确方法是什么?
应用服务器是 WebLogic 10。
我不能为此使用主题,因为在集群中主题会导致过多的消息重复。如果我们有 2 个实例,那么主题将如下所示:
因此,每条消息将被传递两次到 System1 和两次到 System2,如果集群中有 8 台服务器,则每条消息将被传递 8 次。这是我真正想避免的...
最后我有一些时间来测试它,这是我观察到的:集群中有 2 个节点。2 个 JMS 服务器:节点 1 上的 jms1,节点 2 上的 jms2。分布式主题 dt。具有持久订阅和 jms-client-id=durableSubscriber 的 MDB。启动系统:0 条消息,mdb@node1 已启动,mdb@node2 尝试定期连接,但无法连接,因为“客户端 id,durableSubscriber,正在使用中”。正如预期的那样。
发送了 100 条消息:jms1@dt 消息当前 = 0,消息总数 = 100,消费者当前 = 1 我可以看到 node1 处理了 100 条消息。
jms2@dt 消息当前 = 100,消息总数 = 100,消费者当前 = 1 即“重复”消息在主题中未决。
又发送了 100 条消息,其中 100 条在 node1 上处理,200 条在 node2 上待处理。
重新启动 node1,mdb@node2 重新连接到 dt 并开始处理“待处理”消息。在 node2 上处理了 200 条消息。
node1 启动后,mdb@node1 无法连接到 dt,而 mdb@node2 已连接。
jms1@dt 消息当前 = 0,消息总数 = 0,消费者当前 = 0
jms2@dt 消息当前 = 0,消息总数 = 200,消费者当前 = 1
再发送 100 条消息,我看到所有 100 条消息都在 node2 上处理并在 node1 上丢弃。
jms1@dt 消息当前 = 0,消息总数 = 100,消费者当前 = 0
jms2@dt 消息当前 = 0,消息总数 = 300,消费者当前 = 1
现在我重新启动 node2,mdb@node1 重新连接到 dt。重新启动后,mdb@node2 重新连接到 dt,mdb@node1 与 dt 断开连接。
jms1@dt 消息当前 = 0,消息总数 = 100,消费者当前 = 1
jms2@dt 消息当前 = 0,消息总数 = 0,消费者当前 = 1
我发送了 100 条消息,所有消息都在 node2 上处理并存储在 node1 上的主题中:
jms1@dt 消息当前 = 100,消息总数 = 200,消费者当前 = 1
jms2@dt 消息当前 = 0,消息总数 = 0,消费者当前 = 1
然后我关闭了 node2,在 mdb@node1 重新连接到主题后,我看到 node1 上正在处理 100 条“待处理消息”。
所以结果是:我发送了 400 条消息,MDB 处理了 700 条,其中 300 条是重复的。
看起来 MDB 重新连接按预期运行良好,但如果托管“活动”MDB 的节点出现故障,则消息可能会重复。
这可能是 weblogic JMS 实现的错误或特性。
c# - 我如何使用 NServiceBus 来竞争消费者
我想到了 nservicebus http://docs.particular.net/的文档,但仍然困惑我该如何做我想做的事。
我的目标是拥有一个 Windows 服务,生成任务并将它们放入队列中,另一方面,我需要一些消费者,只要谁有空,就从队列中提取任务,并执行消息中指定的工作。
谁能给我一些提示,我该如何继续?
谢谢
integration - 如何解决 ESB 中的批处理问题?
我们有一个遗留系统,它生成的文件每个都包含数百条消息(金融交易)。我们需要将这些消息转换为另一种格式并(单独)将它们提交到目标系统。问题是:ESB 是否应该直接接受这些文件进行处理,或者是否应该在遗留系统和 ESB 之间存在一个适配器应用程序,它将接收到的文件拆分为单独的消息并让 ESB 单独处理消息(而不是处理整个文件)?
在第一个解决方案中,我们期望两个 ESB 流。第一个将文件转换为新格式,将其拆分为消息,并将这些消息存储到临时位置。转换需要将文件作为一个整体进行处理,因为该文件包含转换单个消息所需的一些公共部分。第二个流程将获取单独的转换消息(每个都在一个单独的 DB 事务中),将它们传递给目标系统,并等待它的答案(同步或异步)。
第二种解决方案将用一个外部应用程序替换第一个流,该应用程序将转换文件,将其拆分为单独的转换消息,并将它们存储在临时位置(本地文件系统)。第二个流将保留在 ESB 中。
在我们看来,第一种解决方案的缺点在于 ESB 必须处理大文件(在第一个流程中),这通常被认为是一种反模式。另一方面,ESB 会直接适应遗留系统的接口,这是 ESB 的目的之一。
在第二种解决方案中,适配器应用程序将包含转换逻辑,这应该是 ESB 的另一个目的和职责。
对于这种情况(模式),通常建议的解决方案是什么?您能否提供一些比我找到的这两个链接更具描述性的参考资料?
https://www.ibm.com/developerworks/wikis/display/esbpatterns/File+Processing
编辑 另一个参考: http ://www.ibm.com/developerworks/webservices/library/ws-largemessaging/
soa - 企业集成模式和 HTTP (SOAP/REST)
您好通过了 Gregor Hohpe 和 Bobby Woolf 的企业集成模式。
http://www.eaipatterns.com/toc.html 我还了解了 Camel 和 Mule 对这些集成模式的遵守情况——
http://camel.apache.org/enterprise-integration-patterns.html
我看到 Mule 和 Camel 都允许通过 SOAP 或 REST 等 Web 服务部署和访问应用程序,SOAP 更像 RPC 风格。它们允许使用 CXF 和 Jersey 等开源实用程序进行大规模集成支持。事实上,Mule 还支持 RMI 端点——这也将提供远程方法调用能力,这是一种被广泛接受的集成形式。我了解 ESB 是围绕消息总线构建的,并额外支持其他协议,但是 ESB 仅符合 EIP,而 EIP 不仅仅是 ESB。
问题是为什么 SOAP/REST 或它们的传输协议不被视为“集成样式”,而企业集成又为何如此“面向消息”?
与设计这些模式但试图理解集成模式不平衡的信息本质的伟大思想相比,我是一个新手。我承认这不是堆栈溢出的 QnA 格式,但会要求 Mods 将其保持一段时间,以便人们可以分享他们的意见。
java - 如何使用 apache-camel 构建管道和过滤器 eip 模式
我正在尝试做一个 PoC,以便使用Apache Camel实现管道和过滤器 eip 模式。
从Camel 文档中,我假设每个过滤器都必须作为一个Endpoint实现(“使用 Camel,您可以将处理拆分为多个独立的 Endpoint 实例,然后这些实例可以链接在一起。”)
因此,如果我理解正确,则 Authenticate 过滤器(来自示例)必须实现Endpoint interface。
“问题”是我不想“重新发明轮子”。因此,我几乎可以肯定我可以使用已经实现的接口,而不是从头开始实现接口。一个是BeanEndpoint。
那正确吗?
我发现了一些管道和过滤器模式的例子(比如这个),但没有一个显示如何实现 bean。
有人可以提供一个bean实现示例吗?
TIA,
鲍勃
apache-camel - 分布式企业集成模式
我正在开发一个使用骆驼的云应用程序。它将消息发送到由 Web 服务使用的 SQS 队列。是否有解决方案可以在应用程序扩展时控制每个骆驼生产者服务?即开始/停止路线。
multithreading - 骆驼收件人列表如何转发消息
.from("direct:A")
行为类似于 java 方法,即调用它的线程将继续process()
。
那么在上述情况下会发生什么?
假设线程t1
调用from("direct:A")
然后
t1
将继续process()
然后t1
将进入recipientList()
现在从这里开始将t1
调用from("direct:B")
然后from("direct:C")
同步调用
或者
direct:b
并将direct:c
在两个新线程中异步调用。
java - 了解 apache camel 中的拆分行为
.from("direct:A")
行为类似于 java 方法,即调用它的线程将继续split
。
那么在上述情况下会发生什么?
莱伊说线程t1
调用from("direct:A")
然后
它进入.split()
这里的 msg 分为两条新消息M1
和M2
.
现在从这里开始会同步调用吗t1
?process()
M1
M2
或者
process()
会在两个新线程中异步M1
调用吗?M2
apache-camel - 有很多条件的基于骆驼内容的路由器
我在标头中有一条具有特定值(例如 100、101)的消息,我需要根据该值采取特定操作。
我知道我可以为基于内容的路由编写带有 when / else 分支的路由。我的问题是:如果我有大约 400 个不同的案例怎么办?在这些情况下是否有管理路由的最佳实践?
java - Apache Camel:分离器、CBR 还是动态路由器?
我有以下 POJO:
以及以下路线(Spring XML):
在哪里myPOJOFactory
:
我现在需要一种方法将MyPOJO
实例(在myPOJOFactory
bean 中创建)拆分为其组成部分Fizz
和Buzz
属性,并以Fizz
一种方式和Buzz
另一种方式路由。
我对Splitter的理解是它只需要交换的主体并将其分解为 2+ 个对象的集合。但我不认为这是我想要的,因为虽然我确实希望将MyPOJO
其“拆分”成其组成部分Fizz
和Buzz
字段,但我希望它们被路由到不同的目的地。也许Fizz
去去去。direct:fizzFarm
_ Buzz
_direct:buzzFarm
我对基于内容的路由器( <choice/>
) 的理解是,它允许您将条件if-else-if
逻辑添加到路由中。但我也不认为我想要这个,因为我需要的不是有条件的:我总是想要MyPOJO#Fizz
去direct:fizzFarm
,而且我总是想要MyPOJO#Buzz
去direct:buzzFarm
。
我对动态路由器的理解是它将消息动态地路由到不同的目的地,尽管我不太确定如何。我相信这就是我想要的,但是,从myPOJOFactory
bean 中出来,交换将包含一个MyPOJO
对象。我觉得MyPOJO
在将其发送到动态路由器之前,我必须先拆分它。这样,动态路由器将能够清楚地看到消息是 aFizz
还是 a Buzz
,并正确路由它。
所以我相信我需要将分离器与动态路由器结合使用。我只是没有透过树木看到森林。像这样的东西:
关于我如何实现这一点的任何想法(#1 拆分MyPOJO
为Fizz
and Buzz
,#2 设置路由器以路由Fizz
到Buzz
不同的目的地)?