Postgresql 当使用两个需要同步的数据库时,如何实现乐观(或悲观)锁定?
我正在开发一个解决方案,其中我们有两个数据库,用于以下目的:Postgresql 当使用两个需要同步的数据库时,如何实现乐观(或悲观)锁定?,postgresql,elasticsearch,concurrency,optimistic-locking,pessimistic-locking,Postgresql,elasticsearch,Concurrency,Optimistic Locking,Pessimistic Locking,我正在开发一个解决方案,其中我们有两个数据库,用于以下目的: 用于搜索目的的弹性搜索 作为数据真实来源的Postgres数据库 我们的应用程序允许用户检索和更新产品,产品具有多个属性:名称、价格、描述等。。。两个典型用例是: 按名称检索产品:使用elasticsearch执行搜索,然后ES检索到的ID用于对Postgres的二次查询,以获取实际和可信的数据(因此,我们可以在获取可信数据的同时快速搜索大表) 更新产品字段:我们允许用户更新任何产品信息(类似于协作wiki)。首先,我们将数据存
- 用于搜索目的的弹性搜索
- 作为数据真实来源的Postgres数据库
- 按名称检索产品:使用elasticsearch执行搜索,然后ES检索到的ID用于对Postgres的二次查询,以获取实际和可信的数据(因此,我们可以在获取可信数据的同时快速搜索大表)
- 更新产品字段:我们允许用户更新任何产品信息(类似于协作wiki)。首先,我们将数据存储在Postgres中,然后存储到Elasticsearch中
我可以用什么方法/选项来解决我的这类问题?我可能会引来一些批评,但让我用我理解的方式来解释你。我的理解是,这个问题/关注点更多的是架构的角度,而不是设计/代码的角度 即时一致性,当然还有最终一致性 来自应用层 对于两个数据库之间的
即时一致性
,实现它们的唯一方法是以事务方式执行polygot持久化
,以便Postgres
和ElasticSearch
中的相同数据都得到更新,或者没有更新。我不建议这样做,因为这会给应用程序带来很大的压力,而且您会发现很难扩展/维护
因此基本上GUI-->应用层-->Postgres/Elasticsearch
队列/实时流机制
您需要有一个消息队列,以便更新将进入基于事件的队列中
GUI --> Application Layer --> Postgres--> Queue --> Elasticsearch
最终一致性,但不是立即一致性
有一个单独的应用程序,通常我们称之为索引器
。此工具的目的是从postgres
执行更新,并将其推入Elasticsearch
在索引器
中,您可以对每个源进行多个单一配置,这将
- 执行
选择*
并将所有内容
索引到弹性搜索
或完全爬网
- 当您想将整个数据删除/重新索引到
Elasticsearch
- 能够在Postgres中仅检测更新的行
,从而将它们推入Elasticsearch或增量爬网
- 为此,您需要根据postgres行的状态使用select查询with where子句,例如,为最近更新的文档提取状态为
的记录,或根据0
提取在最近时间戳
30秒/1分钟内更新的记录,或根据您的需要增量查询
- 执行增量爬网后,如果使用
状态执行增量爬网,则需要将其状态更改为
(成功)或“-1”(失败),以便在下一次爬网中不会拾取相同的文档增量后查询1
- 基本上,将作业安排为在索引操作中运行上述查询李>
GUI-->应用层-->Postgres-->索引器-->Elasticsearch
总结
我不认为考虑防故障的方法是明智的,相反,我们应该有一个系统,当涉及到提供两个不同数据源之间的一致性时,能够在尽可能快的时间内恢复
将系统解耦将大大有助于扩展和解决与数据正确性/质量相关的问题,同时将帮助您处理频繁的更新以及数据和更新的增长率
另外,我还推荐一种可以帮助你的方法
希望有帮助 我不认为你的问题是乐观/悲观。您的问题似乎与订单有关。例如,如果您保证了更新的顺序,那么简单地使用更新执行时间戳,并且仅当时间戳大于当前时间戳时才更新。当然,您的解决方案应该考虑得更周到。我建议阅读
事件来源
,这将更好地应用于此问题的解决方案,特别是当涉及到最终一致的
商店时。想法是,你不应该关心商店的状态,而应该保证到达事件的顺序,那么最终你的商店将是一致的。