我们正在开发一个应用程序,它利用存储在Gemfire中的深层对象模型。客户端将访问REST服务以执行缓存操作,而不是通过Gemfire客户端访问缓存。我们还计划在Gemfire下面建立一个数据库作为记录系统,利用异步后写来进行数据库更新和插入。
在这种情况下,保证Gemfire中的插入或更新将导致数据库中的成功插入或更新而不设置精心设计的服务器端验证(基本上是对Gemfire的约束)似乎是一个非常重要的问题。操作必须匹配DB操作约束)。我们不能将数据库插入冒泡或将成功/失败更新回客户端,而不会使数据库调用与Gemfire操作同步。这显然会破坏使用Gemfire进行低延迟客户端操作的目的。
我们很好奇其他使用后写的Gemfire采用者如何解决使数据库与Gemfire数据结构保持同步的问题?
答案 0 :(得分:1)
我们通常建议在CacheWriter中实现GemFire中的验证,因为根据定义,它将在缓存上发生任何修改之前被调用。
http://gemfire.docs.gopivotal.com/javadocs/japi/com/gemstone/gemfire/cache/CacheWriter.html
也就是说,我在客户看到的模式是接收区域“A”的数据并在那里实施基本验证,接受该数据。然后,如您所述,使用write-behind将此数据复制到数据库,通过AsyncEventListener进行批处理,在插入的try / catch中,如果发生任何错误,它们会将该数据存储在另一个具有另一个写入侦听器的区域中。后面,非批处理,所以你实际上可以看到哪个记录失败并决定做什么相应的。
类似的东西:
数据 - > cacheWriter基本检查 - >区域A - >; AEL(批次500~N事件) - > D B 如果发生错误,则复制到区域B - >监听器在DB上保留个人记录 - > 对失败的记录做一些操作。
在他们的情况下,他们有一个界面来手动清除区域B上的待处理记录。
希望有帮助,如果没有,也许你可以提供有关你的用例的更多细节......
干杯。
答案 1 :(得分:0)
您可以注册AsyncEventListener并使用批量更新更新您的数据库。欲了解更多信息: http://pubs.vmware.com/vfabric53/topic/com.vmware.vfabric.gemfire.7.0/developing/events/implementing_write_behind_event_handler.html
答案 2 :(得分:0)
Gemfire ver8及以上版本解决了访问Cache对象REST服务的问题。