在Couchbase中更新或创建文档时,我希望能够进行一些数据操作。
文档可以通过Sync Gateway或我们自己的从http服务流式传输数据的代码到达我们的数据库。拥有一个可以拦截所有更新的地方,将是非常不错的。
我们正在对此数据运行一个Spring Boot REST API,因此这是拥有拦截器/侦听器的好地方。无论哪种方式,我都倾向于Java解决方案。
数据被编写为JSON而不是使用Spring实体,因此我不能使用仅侦听Entity类事件的ApplicationListener。如果我错了纠正我。我可以找到一些珍贵的设置ApplicationListeners的示例,因此我在这里可能错了,但似乎无法正常工作。
我看到有一个Eventing服务,您可以在其中编写Java脚本,但是由于多种原因,我不愿意这样做。我不希望在平台和语言之间分散我们的API代码,不确定是否可以在我们的系统上运行事件服务,等等。同样,我也可以公开辩论。
据我所知,这仅使DCP显得很低。 https://blog.couchbase.com/couchbases-history-everything-dcp/,但看起来像是完成工作的工具。
问题:还有一种替代的,较低级别的方法,可以在Couchbase中捕获JSON对象(不是DCP实体)的JSON对象的更新事件。
答案 0 :(得分:3)
免责声明:我为Couchbase工作,并开发了Java DCP客户端。
如果您已经评估了Eventing服务并确定它不符合您的要求,那么Java DCP client可能值得研究,即使它不是官方支持的。卡夫卡(Kafka),Spark和Elasticsearch的官方Couchbase连接器都使用它,它们都是开放源代码,并且正在积极维护。
如果您只关心自应用启动以来发生的事件,则用法可以像registering a callback and starting the event stream一样简单。如果您需要记住自己在流中的位置并稍后再恢复(例如,处理脱机时发生的事件),事情会变得有些复杂,但是这里有example code for that case too。
DCP协议本身为well documented。如果您决定采用这种方法,那么最好至少阅读该文档的 Architecture 部分。另请注意,由于不支持Java DCP客户端,因此该API可能会更改,恕不另行通知。 (官方支持该库并提供更友好的API是我们的长期目标之一,但我们尚未做出任何承诺。)
答案 1 :(得分:2)
与David一样,我也在Couchbase担任Eventing服务的产品经理。
在Couchbase中更新或创建文档时,我希望能够进行一些数据操作。
事件肯定可以使任何人通过微小的JavaScript片段对突变(插入或插入)进行响应并执行数据操作。只需看一下couchbase-eventing-small-scripts-that-solve-big-problems即可获得快速介绍,还有文档中的eventing-examples。
如果您确实在启用了SGW的存储桶上执行Eventing服务路线,则需要通过Eventing内置的crc64()函数抑制重复突变(有关详细信息,请转到eventing-language-constructs并搜索:Sync Gateway)。此外,如果您要让Eventing直接更新源存储桶(如果在该存储桶上启用了SGW),则有一个更复杂的解决方法(请与我联系,我很乐意提供该信息)
接下来你说:
不确定我可以在我们的系统上运行事件服务
与Couchbase Enterprise产品捆绑在一起的Eventing服务,它提供可伸缩的基础结构,以在数据或文档发生更改或变异时在数据或文档上运行简单的JavaScript片段,而无需SDK的开销。您可以将独立的Eventing节点添加到Couchbase群集中,或者将Eventing服务与其他现有节点并置。