0

我正在尝试配置 Gemfire/Geode,以便parallel=true在复制区域上有一个异步事件队列。但是,我在启动时遇到以下异常:

com.gemstone.gemfire.internal.cache.wan.AsyncEventQueueConfigurationException: Parallel Async Event Queue myQueue can not be used with replicated region /myRegion

这(即防止复制区域上的并行队列)似乎是一个设计决定,但我不明白为什么会这样。
我已经阅读了我能找到的所有文档(主要是http://gemfire.docs.pivotal.io/docs-gemfire/latest/reference/book_intro.html和相关文档),并搜索了任何类型的参考这个例外在互联网上,但我没有找到任何明确的解释说明为什么我不能在每个托管复制区域的成员上都有一个事件侦听器。
我的结论是我一定遗漏了一些关于复制区域和/或并行队列的基本概念,但由于我自己找不到合适的文档,我要求解释和/或指向正确的资源读。

提前致谢。

编辑:让我把这个问题放在上下文中。
我有一个外部系统使用 REST 服务向我的应用程序发送数据,这些服务在节点之间进行负载平衡,以最大限度地提高性能。每个节点都托管相同的区域(比如说 3 个,名为 AB 和 C)。数据经过所有这些区域(A 到 B 到 C)并在此过程中进行处理。这意味着区域 A 托管刚刚收到的数据,区域 B 已部分处理的数据和区域 C 托管已完成处理的数据。
我正在使用事件侦听器来处理数据并将其从一个区域移动到另一个区域,如果是区域 C 的侦听器,则将其导出到另一个外部系统。
所有的听众都必须(我重复一遍,必须)是事务性的。
我还需要水平可扩展性(即动态添加节点以增加吞吐量)和可能实现的最大数据复制量。
此外,我想用相同的 gemfire 配置运行所有节点。

我已经尝试过使用分区区域,但是由于一系列原因,它们不适合我的需求,为了简洁起见,我不会在这里解释(相信我,目前还不可能)。

所以我认为让所有节点托管复制的区域可能是一种方式,但我需要它们都能够独立处理事件并在活动/活动场景中执行区域同步。据我了解,这要求事件队列是并行的,但这似乎是不可能的(按设计)。

所以(更新的)问题是:这种情况甚至可能吗?如果是,我该如何实现?任何解释和/或文档、示例、资源或其他任何内容都非常受欢迎。

再次,提前感谢。

4

1 回答 1

2

AsyncEventQueue用于将到达 GemFire的数据写入其他数据存储。理想情况下,您只希望这样做一次。由于复制区域的内容在系统的所有成员上都是相同的,因此您只需要一个成员上的 Async 事件侦听器,因此parallel=true不支持。

对于分区区域,如果您只有一个托管 AsyncQueue 的成员,那么每个放入分区区域的文件也将通过该成员进行路由。这在系统中引入了单点争用。这个问题的解决方案是引入并行 AsyncQueues,以便每个成员上的事件仅在该成员本地排队。

GemFire 还支持CacheListeners,即使对于复制区域,它们也会在每个成员上调用,但是它们是同步的。您可以在 CacheListener 中引入线程池以获得相同的功能。

于 2016-07-19T23:04:32.923 回答