普通队列 vs SEDA队列

16
作为Apache Camel的新手,我最近正在审查其长列表中的组件,并偶然发现它们支持SEDA队列组件。 这个页面对我来说毫无意义,所以我搜索了一下“SEDA队列”这个词,并找到了维基百科文章here。 阅读完那篇文章后,我无法区分SEDA队列和普通的“普通”队列之间的区别!两者都通过使用异步队列来实现解耦系统的概念。 从文章中看,“SEDA”听起来只是将队列放置在每个组件之间的一种架构。这是正确的吗? 但如果它只是一种架构,那么为什么“SEDA”队列是特殊的Apache Camel组件呢?

4
SEDA意味着一个线程连接到队列,就像ExecutorService(一个队列和线程池)。也许这就是它在这里的意思。 - Peter Lawrey
我不知道自从这个问题被提出以来文档是否已经更新,但基本上第一行就说了:“seda:组件提供异步SEDA行为,因此消息在BlockingQueue上交换,并且消费者是在与生产者_不同的线程_中调用的。” - DavidS
3个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
11

SEDA是“Staged Event Driven Architecture”的缩写,它被设计成一种机制来调节消息处理的不同阶段之间的流量。其想法是平滑整个过程中消息输出的频率,使其与输入相匹配。它允许一个端点的消费者线程将长时间运行的操作的工作转移到后台,从而释放它们以消耗传输的消息。

当交换机传递给端点时,它将被放置在BlockingQueue中。列表存在于Camel上下文中,这意味着只有那些在同一上下文中的路由可以通过此类型的端点连接起来。该队列默认情况下是无界的,但可以通过在使用者URI上设置大小属性来更改。

默认情况下,分配给端点的单个线程会从列表中读取交换机并通过路由进行处理。如前面的示例所示,可以增加concurrenctConsumers的数量,以确保及时处理列表中的交换机。

SEDA模式最适合处理InOnly消息,其中一个路由完成处理并将其移交给另一个处理下一个阶段。当消息交换模式为InOut时,可以通过调用端点请求响应。

参考文献: Apache Camel Developer's Cookbook


9

SEDA队列就像普通队列一样(正如Peter在上面所说,在Camel中,它们与线程池相关联,作为组件的一部分)。SEDA是一种架构。Camel中的SEDA组件使用进程内存储的队列,并且是一个单独的组件,以区别于Apache Camel中的其他队列组件,即JMS组件。


1
SEDA提供了在单个骆驼路线内部组件的解耦。或者说,在单个进程中也可以实现。这意味着它可以帮助您对其他组件进行异步调用...它是一个内存阻塞队列。 另一方面,JMS用于整个系统的解耦... JMS将涉及外部代理。SEDA仅会从消费者组件创建一个单独的线程。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,