问题标签 [eai]
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 - 调用其他有界上下文的策略
我目前正在进行一个涉及领域驱动设计 (DDD) 和多个领域集成方案的研究项目。
我在一个有界上下文中有一个用例,我需要联系另一个 BC 来验证聚合。事实上,未来可能会有几个 BC 要求验证数据(但现在没有)。
现在,我患有 DDD 强迫症神经衰弱,我无法找到正确应用模式的方法(笑)。我真的很感谢人们对此的一些反馈。
关于 2 个有界上下文。
- 发生用例的第一个(BC_A)将包含与用户相关的元素列表。
- 外部的 (BC_B) 对这些元素有一些了解
* 因此,从 BC_A 到 BC_B 的验证请求将要求对来自 BC_A 的聚合的所有元素进行审查,并返回一份报告,其中包含有关如何处理这些元素的一些规范元素(我们是否应该保留它,以及为什么)。
*聚合的状态将通过(比如说)“草稿”,然后在请求后“验证”,然后根据发回的报告,如果有的话,它将是“有效”或“has_error”。如果用户后来选择不遵循规范,它可以将聚合的状态传递给“受控”,这意味着存在一些错误,但我们不处理它。
该命令是ValidateMyAggregateCommand
用例是:
- 通过 id 获取目标聚合
- 将其状态更改为“正在验证”
- 坚持聚合
- 拨打验证电话(到另一个 BC)
- 持久化验证报告
- 使用目标聚合确认验证报告(它将根据结果再次更改其状态,应为“OK”或“HAS_ERROR”)
- 再次持久化聚合
- 根据验证结果生成域事件
它包含 8 个步骤,可能从 1 到 3 笔交易或更多。
我需要在本地保存验证报告(在 UI 中访问它),我想我可以做到:
- 在独立验证调用之后(报告是它自己的汇总)
- 当我坚持目标聚合时(它会在里面)
我更喜欢第一个选项(第 5 步),因为它更加解耦——即使我们可以说这里有一个不变量(???)——因此在报告的持久性和由总计的。
我实际上正在为通话本身而苦苦挣扎(第 4 步)。
我想我可以通过几种方式做到这一点:
- A. 使用 REST 实现的同步 RPC 调用
- B. 没有响应的调用(void)(即发即弃)让几个实现选项放在表上(同步/异步)
- C. 领域事件翻译成技术事件到达其他 BC
A. 同步 RPC 调用
这validationService
是一个在基础设施层中实现的域服务,带有一个 REST 服务 bean(也可以是本地验证,但在我的场景中不是)。
调用需要立即响应,调用者(命令处理程序)被阻塞,直到返回响应。因此它引入了高时间耦合。
如果由于技术原因验证调用失败,我们会处理异常,我们必须回滚所有内容。该命令必须稍后重播。
B. 无响应调用(同步或异步)
在这个版本中,命令处理程序将保持聚合的“验证”状态,并触发(并忘记)验证请求。
在这里,报告的确认可以在初始事务内部或外部以同步或异步方式发生。
将上述代码放在专用事务中可以使验证调用中的失败无害(如果我们在 impl 中有重试机制)。
该解决方案将允许快速轻松地开始同步通信,然后切换到异步通信。所以它是灵活的。
B.1。同步实现
在这种情况下,validationRequestService(在基础设施层中)的实现会直接请求/响应。
报告在专用事务中持久保存,事件的发布激活第三个代码片段(在应用程序层中),该代码片段在聚合上执行实际确认工作。
所以在这里,我们有一个从基础层到应用层的事件。
B.2。异步
异步版本将更改 ValidationRequestService impl (code_fragment_b1_a) 中的先前解决方案。使用 JMS/AMQP bean 将允许第一次发送消息,然后独立接收响应。
我猜消息侦听器会触发相同的 ValidationReportReceived 事件,而 code_fragment_b1_b 的其余代码将是相同的。
当我写这篇文章时,我意识到这个解决方案(B2)在交换中呈现出更好的对称性和更好的技术点,因为它在网络通信方面更加解耦和可靠。在这一点上,它并没有引入这么多的复杂性。
C. 领域事件和 BC 之间的总线
最后一个实现,而不是使用域服务从其他 BC 请求验证,我会引发一个域事件,如 MyAggregateValidationRequested。我意识到这是一个“强制”域事件,用户请求它,但它从未真正出现在对话中,但它仍然是一个域事件。
问题是,我还不知道如何以及在哪里放置事件处理程序。基础设施处理程序是否应该直接接受它?
我应该在将域事件发送到目的地之前将其转换为技术事件吗???
如果它是一种数据结构,则像某种 DTO 之类的技术事件
我猜所有与消息传递相关的代码都属于基础设施层(端口/适配器插槽),因为它们仅用于系统之间的通信。
在这些管道中传输的技术事件及其引发/处理代码应该属于应用程序层,因为就像命令一样,它们最终会导致系统状态的突变。它们协调域,并由基础设施触发(如控制器触发应用程序服务)。
我阅读了一些关于在命令中翻译事件的解决方案,但我认为它使系统更加复杂而没有任何好处。
所以我的应用程序外观将公开 3 种类型的交互:-命令-查询-事件
通过这种分离,我认为我们可以更清楚地将命令与 UI 和事件与其他 BC 隔离开来。
好的,我意识到这篇文章很长而且可能有点混乱,但这就是我卡住的地方,所以如果你能说一些可以帮助我的话,我提前感谢你。
所以我的问题是我正在努力整合 2 BC。
不同
的解决方案: - 服务 RPC (#A) 很简单,但限制了规模,
- 带有消息传递的服务 (#B) 似乎正确,但我仍然需要反馈,
- 和域事件 (#C) 我真的不知道如何跨越国界。
再次感谢你!
architecture - mulesoft (ESB) 与中心辐射型有何不同?
我的初衷是了解 ESB 架构和 Hub-Spoke 架构的区别。恐怕,无论给出多少答案,我都无法清楚地理解它。
以下是我的理解 - ESB 不是产品,而是架构拓扑 - ESB 促进松散耦合集成并减少依赖 - Mulesoft ESB 和市场上的其他 ESB 提供的不仅仅是 ESB 特性 - 消息路由/Web 服务支持
我想要理解的一点是——它与 HUB-SPOKE 架构有什么不同?
ESB 表示,分布式消息传递架构使其能够以减少依赖性和可能减少停机时间的方式工作。但是怎么做?是因为“适配器”/集成层在源应用程序和目标应用程序中吗?如果是这样,为什么 Mulesoft 或市场上的任何 ESB 建议它们提供大量的适配器?
如果是架构设计的问题,这是否意味着我可以在应用程序端使用适配器并仅将 ESB 用于路由?让 MUlesoft 提供的适配器不用?
更重要的是,它和Hub有什么不同?从技术上讲,为什么说“HUB-SPOKE”不允许分布式消息传递架构?
对此的任何帮助将不胜感激。提前致谢。
soa - Daas 和 EAI 的区别
Daas 数据即服务和 EAI 企业应用程序集成有什么区别?我了解 EAI 是一个框架,旨在克服使用 ESB 企业服务总线的企业软件集成(在 ERP、SCM、CRM 等之间)的复杂性,想知道 DAAS 在图中的位置吗?也想了解一下EAI和SOA的区别
architecture - 记录系统是否应该复制到不同的系统?
我有一个客户主系统,用于存储、更新和检索客户信息。服务调用大约为 300-600 毫秒。显然,这是记录系统。
我正在设计另一个需要客户主信息的促销系统。我想知道促销系统是否应该在每次需要客户主信息时调用客户主系统,还是应该保留数据库副本并尝试定期与客户主系统同步?
jboss - 单向 MEP 和请求-响应 MEP 有什么区别?
在JBossESB 程序员手册中,它被提及为:
“JBossESB 中客户端和服务之间的所有交互都是通过消息交换发生的。为了鼓励松耦合,我们推荐一种基于单向消息的消息交换模式,即请求和响应是独立的消息,在必要时由基础设施或应用程序关联。”</p>
但是,如果请求和响应是单向 MEP 的独立消息,那么它与请求响应 MEP 有什么区别?
使用它们的实际优势是什么?
siebel - 如何替换 Siebel 数据映射中的文本?
我有一个传出 Web 服务,可以将数据从 Siebel 7.8 发送到外部系统。为了使集成起作用,在发送数据之前,我必须更改其中一个字段值,将每次出现的 替换"old"
为"new"
。如何使用 EAI 数据映射做到这一点?
在理想的世界中,我只会使用集成源表达式,例如Replace([Description], "old", "new")
. 然而,Siebel 远非理想,并且没有替换功能(或者如果有,也没有记录)。我可以使用所有不需要执行上下文的Siebel 查询语言函数。我还可以使用可用于计算字段的函数(理智的人可能期望两个列表相同,但 Siebel 文档也远非理想)。
我的第一次尝试是使用该InvokeServiceMethod
功能并自己在 eScript 中替换文本。所以,这是我的字段映射源表达式:
经过一些配置步骤后,它工作正常......除非我的描述字段包含"
字符:Error parsing expression 'In="This is a "test" with quotes"' for field '3' (SBL-DAT-00481)
我知道为什么会这样。我的双引号破坏了表达式,我必须通过加倍字符来转义它们,如This is a ""test"" with quotes
. 但是,如何替换每个"
以""
调用我的业务服务......如果我没有替换功能?:)
Oracle 的支持网站对于 SBL-DAT-00481 错误只有一个结果,作为一种解决方法,建议将整个参数放在双引号内(我已经有了)。有一个链接的文档,他们在其中承认该解决方法对逗号或单引号等几个字符有效,但由于 Siebel 7.7-7.8 中的错误(8.0+ 中不存在),它不适用于双引号. 他们建议将行 ID 作为参数传递给业务服务,然后直接从 BC 检索数据。
在我这样做并最终得到一个影响性能的解决方法(仅传递 ID)之前,对于解决方法(使用双引号)对于没有替换功能的解决方法(使用 InvokeServiceMethod)......我在这里发疯了吗?难道没有一种简单的方法可以在 Siebel 数据映射中进行简单的文本替换吗?
web-services - Webservice 和企业服务总线之间的区别
我想知道 Webservice 和 Enterprise Service Bus (Ex- Mule) 之间的区别。当我搜索它时,我没有从互联网上获得太多信息。
据我了解,企业服务总线用于集成服务,以便任何其他应用程序都可以使用和调用或集成。Web 服务是企业服务总线中使用的一种方式。
java - 如何在 JMS/MOM 系统上实现同步 Web 服务?
我正在从事一个具有许多遗留异构系统的项目。我们计划使用 JMS/MOM/ESB 连接它们,但需要来自客户端的同步 Web 服务调用。即使用Web 服务的请求/响应架构是一项要求。客户将拨打电话并等待响应。
我的问题是我们如何实现内部在 JMS/MOM 上工作以连接绝望系统的请求/响应系统?
第二个问题:任何现有的 JMS/MOM 或 ESB 实现是否支持这种同步架构?
maven - JBoss Fuse/ Red Hat JBoss developer Studio,Fuse 集成项目错误
在图形 Camel 项目中的以下 POM 文件上运行 maven install 或 maven clean 时出现错误。我正在使用红帽 JBoss 开发者工作室
我的 pom fly 如下
我在控制台中得到的错误信息如下
不可解析的导入 POM:在 https://(我们的nexus 存储库)/content/groups/public 中找不到 org.jboss.fuse.bom:jboss-fuse-parent:pom:6.3.0.redhat-187 失败在本地存储库中,直到(我们的 nexus 存储库).com 的更新间隔已过或强制更新@第 29 行第 19 列 -> [帮助 2] [错误],才会重新尝试解析
任何和所有的帮助都将结束我为解决问题而进行的长期搜索,从而获得我永远的感激之情。
PS 我已经完成了 maven 配置,以便按照Redhat 文档网站上的建议设置所需的依赖配置文件
第二版 POM 基于 28.12.16 1500 小时 CET 的建议。