标签: integration-patterns

如何在Java中以同步方式处理异步回调?

我有一个与架构有关的问题.这是一个与语言无关的问题,但是当我来自Java背景时,如果有人用Java方式引导我,对我来说会更容易.

基本上,我正在编写的中间件与基于SOAP的第三方服务进行通信.调用是异步的 - 在某种程度上,当一个服务被调用时,它返回一个响应01 - 处理; 意味着第三方已成功收到请求.在原始SOAP请求中,每次都必须提交一个回调URL,其中第三方实际发送结果.因此,调用特定服务实际上不会立即返回结果; 结果在中间件的单独HTTP端点中接收.

现在在我们的前端,我们不希望使用户体验复杂化.我们希望我们的用户调用中间件功能(通过菜单项/按钮),并立即获得结果; 并将肮脏的工作留给中间件.

请注意,从前端调用的中间件函数(比如说X())和第三方推送结果的中间件端点URL(让我们称之为Y)完全是彼此分开的.X()不得不等待,然后获取Y中抓取的结果,然后将结果返回到前端.

在此输入图像描述

如何构建一个强大的解决方案来实现上述行为?图片完美地描绘了我的情况.任何建议将受到高度赞赏.

java architecture multithreading asynchronous integration-patterns

11
推荐指数
1
解决办法
1978
查看次数

我如何使用NServiceBus来做竞争消费者

我想到了nservicebus http://docs.particular.net/的文件,但仍然混淆我怎么能做我想做的事情.

我的目标是拥有一个Windows服务,生成任务并将它们放入队列,另一方面,我需要一些消费者,无论谁有空,从队列中获取任务,并在消息中指定作业.

任何人都可以给我一些提示,我怎么能继续?

谢谢

c# nservicebus integration-patterns

4
推荐指数
1
解决办法
637
查看次数

消息类型:消息应包含多少信息?

我们目前开始将事件从一个中央应用程序广播到其他可能感兴趣的消费者应用程序,并且我们团队的成员对于应该在已发布的消息中放入多少内容有不同的选择。

总体思路/架构如下:

  • 生产者应用程序中:
    • 用户与一些可以创建/修改/删除的实体(DDD 意义上的聚合根)进行交互
    • 根据正在发生的情况,引发域事件(例如:EntityXCreated、EntityYDeleted、EntityZTransferred 等...即不仅是 CRUD,而且主要是)
    • 引发的事件被翻译/转换为我们发送到 RabbitMQ Exchange 的消息
  • RabbitMQ中 (我们正在使用 RabbitMQ,但我相信问题实际上与技术无关)
    • 我们为每个消费应用程序定义一个队列
    • 绑定将交换连接到消费者队列(可能带有消息过滤)
  • 消费应用程序中
    • 应用程序使用并处理队列中的消息

基于企业集成模式,我们正在尝试为我们发布的消息定义规范格式,并且在两种方法之间犹豫:

  1. 极简消息/ event-store-ish:对于域模型发布的每个事件,生成一条消息,其中仅包含相关的聚合根部分(例如,当更新完成时,仅发布有关更新部分的信息聚合根的,或多或少匹配最终用户在使用我们的应用程序时经历的过程)

    • 优点

      • 消息尺寸小
      • 非常专业的消息类型
      • 靠近“领域事件”
    • 缺点

      • 如果无法保证交付顺序,则会出现问题(即,如果在创建消息之前收到更新消息怎么办?)
      • 消费者需要知道要订阅哪些消息类型(可能需要一个大列表/领域知识)
      • 如果消费者状态和生产者状态不同步怎么办?
      • 如何处理未来注册但不了解所有过去事件的新消费者
  2. 完全包含的幂等消息:对于域模型发布的每个事件,生成一条消息,其中包含该时间点聚合根的完整快照,因此实际上只处理两种消息“创建或更新”和“删除”(+元数据,如有必要,包含更具体的信息)

    • 优点

      • 幂等(声明性消息指出“这就是事实,尽你所能同步自己”)
      • 需要维护/处理的消息格式数量更少
      • 允许逐步纠正消费者的同步错误
      • 只要生成的消息遵循规范数据模型,消费者就会自动处理新的领域事件
    • 缺点

      • 更大的消息负载
      • 不太纯净

您会推荐一种方法而不是另一种方法吗?

我们还应该考虑另一种方法吗?

domain-driven-design message-queue integration-patterns rabbitmq

4
推荐指数
1
解决办法
1015
查看次数