在Gemfire

时间:2016-07-19 09:30:31

标签: gemfire spring-data-gemfire geode

我正在尝试配置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服务向我的应用程序发送数据,REST服务在节点之间进行负载平衡,以便最大限度地提高性能。每个节点都承载相同的区域(比方说3,名为A B和C)。数据通过所有这些区域(A到B到C)并沿途进行处理。这意味着区域A托管刚收到的数据,区域B数据已部分处理,区域C托管处理完成的数据。
我正在使用事件监听器处理数据并将其从一个区域移动到另一个区域,如果是区域C的监听器,则将其导出到另一个外部系统。
所有听众必须(并且我重复,必须)是交易性的 我还需要水平可扩展性(即动态添加节点以提高吞吐量)以及可能实现的最大数据复制量。
此外,我想运行具有相同gemfire配置的所有节点。

我已经尝试过使用分区区域,但是由于一些原因我们不能满足我的需要,为了简洁起见我不会在这里解释(只相信我,目前不可能)。

所以我认为让所有节点托管复制区域可能就是这样,但我需要所有节点能够独立处理事件,然后在主动/主动场景中执行区域同步。我的理解是,这要求事件队列是平行的,但似乎不可能(按设计)。

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

再次,先谢谢。

1 个答案:

答案 0 :(得分:1)

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

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

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