通道适配器和消息传递网关模式有啥区别?

Posted

技术标签:

【中文标题】通道适配器和消息传递网关模式有啥区别?【英文标题】:What is the difference between a channel adapter and a messaging gateway pattern?通道适配器和消息传递网关模式有什么区别? 【发布时间】:2011-12-26 12:03:49 【问题描述】:

无论我读了多少关于这两种模式的文章,我都看不出区别。

【问题讨论】:

【参考方案1】:

这是一个很好的问题,因为它们的相似之处在于它们提供了对消息传递系统的应用程序访问。我认为这就是他们实现目标的方式让他们与众不同。

通道适配器模式处理如何在不修改现有系统的情况下从现有系统获取数据。通常,通道适配器是在进程外实现的。经常看到的示例是定期遍历底层数据库以查找要排队的内容的程序。也许是一个独立的应用程序,它调用远程处理或 HTTP API 来访问系统数据以创建消息。关键是,非消息传递系统是完全未修改的。

我认为 Message Gateway 更适用于进程内消息传递集成。这实际上是关于在消息子系统周围应用良好的 OO 封装。也许系统中的某个对象称为 WorkOrderSender,其方法称为 Send(WorkOrder wo)。该类的实现使应用程序免受消息传递的任何细节的影响……对它来说,调用只是另一个方法调用。事实上,应该可以更换您的消息供应商,甚至可以将消息交换为 HTTP 或 FTP 等。

【讨论】:

如果@Pillblast 指的是 Hohpe 和 Woolf 在企业集成模式一书中描述的模式,那么我同意。其他定义可能会有所不同(参见下面 emush 的 Spring 参考)。在我实现了这些模式的情况下,我实际上使用了通道适配器中的消息传递网关来抽象底层消息传递系统,就像我在应用程序中所做的那样。【参考方案2】:

来自 Spring 集成参考文档:

虽然 JMS 通道适配器用于单向消息传递(仅发送或仅接收),但 Spring Integration 还为请求/回复操作提供入站和出站 JMS 网关。

见http://static.springsource.org/spring-integration/reference/htmlsingle/#jms

【讨论】:

【参考方案3】:

在 Spring Integration 中,模式名称 Channel Adapter 适用于任何单向入站或出站适配器。 换句话说,入站通道适配器支持仅输入消息交换,出站通道适配器支持仅输出消息交换。

任何双向或请求-回复适配器在 Spring 集成中都称为网关

通道适配器

通道适配器将应用程序连接到消息传递系统 在 Spring Integration 中,我们选择将定义限制为仅包含连接 是单向的,因此单向消息流以 通道适配器。存在许多不同类型的通道适配器,范围从 方法调用通道适配器到 Web 服务通道适配器

在开头放置一个通道适配器 以及单向消息流的结束。

消息传递网关

在 Spring Integration 中,消息传递网关是一个特定的连接 双向消息传递。如果传入请求需要由多个服务 线程,但调用者需要保持不知道消息传递系统, 入站网关提供了解决方案。 在出站端,传入消息 可以在同步调用中使用,结果在回复通道上发送。

例如,出站网关可用于调用 Web 服务和同步 通过 JMS 进行请求-回复交互。

网关也可用于单向消息流的中游。与 通道适配器,我们在比较中限制了消息网关的定义 到企业集成模式。

参考:Spring Integration in Action

【讨论】:

【参考方案4】:

来自documentation:

入站通道适配器用于单向集成,以将数据引入消息传递应用程序。 出站通道适配器用于单向集成,以将数据发送出消息传递应用程序。 入站网关用于双向集成流,其中一些其他系统调用消息传递应用程序并接收回复。 出站网关用于双向集成流,其中消息传递应用程序调用某些外部服务或实体并期望结果。

【讨论】:

以上是关于通道适配器和消息传递网关模式有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 云消息传递令牌和服务器密钥有啥区别?

从延迟和安全角度来看,Firebase 云消息传递类型之间有啥区别?

activemq消息队列和kafka有啥区别

Spring集成+文件读取消息源_入站通道适配器+出站网关。

Spring Integration 的 XMPP 通道适配器

当 RabbitMQ 交换不存在时如何处理错误(并且消息通过消息传递网关接口发送)