0

我们正在开发一个使用存储在 Gemfire 中的深层对象模型的应用程序。客户端将访问 REST 服务来执行缓存操作,而不是通过 Gemfire 客户端访问缓存。我们还计划在 Gemfire 下建立一个数据库作为记录系统,使用异步后写来执行数据库更新和插入。

在这种情况下,保证对 Gemfire 的插入或更新将导致在数据库中成功插入或更新,而无需设置详细的服务器端验证,这似乎是一个不平凡的问题(本质上,对 Gemfire 操作的约束将以匹配数据库操作约束)。如果数据库调用与 Gemfire 操作同步,我们就无法将数据库插入或更新成功/失败返回给客户端。这显然会破坏使用 Gemfire 进行低延迟客户端操作的目的。

我们很好奇使用 write-behind 的其他 Gemfire 采用者如何解决保持数据库与 Gemfire 数据结构同步的问题?

4

3 回答 3

2

我们通常建议在 GemFire 中的 CacheWriter 中实现验证,因为根据定义,它将在缓存发生任何修改之前被调用。

http://gemfire.docs.gopivotal.com/javadocs/japi/com/gemstone/gemfire/cache/CacheWriter.html

也就是说,我在客户身上看到的一种模式是接收区域“A”的数据并在那里实施基本验证,接受该数据。然后,该数据将使用您所描述的 write-behind 复制到 DB,通过 AsyncEventListener 进行批处理,在插入的 try/catch 中,如果发生任何错误,它们将该数据存储在另一个区域中,该区域具有另一个用于写入的侦听器 -后面,非批处理,因此您实际上可以看到哪个记录失败并决定相应地做什么。

就像是:

数据 -> cacheWriter 基本检查 -> 区域 A -> AEL(批处理 500~N 个事件) -> DB 如果发生错误,则复制到区域 B -> 侦听器将单个记录保存在 DB -> 对失败的记录执行一些操作。

在他们的案例中,他们有一个界面可以手动清除区域 B 上的待处理记录。

希望对您有所帮助,如果没有,您可以提供有关您的用例的更多详细信息...

干杯。

于 2014-05-05T18:24:25.053 回答
0

您可以注册 AsyncEventListener 并使用批量更新来更新您的数据库。更多信息: http: //pubs.vmware.com/vfabric53/topic/com.vmware.vfabric.gemfire.7.0/developing/events/implementing_write_behind_event_handler.html

于 2013-10-03T14:15:33.190 回答
0

Gemfire ver8 及以上版本解决了您访问缓存对象 REST 服务的问题。

宝石火休息

于 2017-05-30T19:36:58.127 回答