Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Postgresql 当使用两个需要同步的数据库时,如何实现乐观(或悲观)锁定?_Postgresql_<img Src="//i.stack.imgur.com/RUiNP.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">elasticsearch_Concurrency_Optimistic Locking_Pessimistic Locking - Fatal编程技术网 elasticsearch,concurrency,optimistic-locking,pessimistic-locking,Postgresql,elasticsearch,Concurrency,Optimistic Locking,Pessimistic Locking" /> elasticsearch,concurrency,optimistic-locking,pessimistic-locking,Postgresql,elasticsearch,Concurrency,Optimistic Locking,Pessimistic Locking" />

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中
然而,正如我所担心的,随着使用该应用程序的人数的增加,我们已经进入了比赛状态;如果用户#1将产品名称更改为“香蕉”,然后用户#2同时将产品名称更改为“苹果”,有时在elasticsearch中保存的最后一条记录将是“香蕉”,而在Postgres中,“苹果”将是最后一个值,从而在数据库之间造成严重的不一致

因此,为了解决我的问题,我冒险阅读了有关乐观/悲观锁定的文章,但到目前为止,我发现的所有文章都与仅使用1个关系数据库相关,并且提供的解决方案依赖于ORM实现(例如Hibernate)。但我们的ES+Postgres组合存储解决方案需要更多的“芭蕾舞”


我可以用什么方法/选项来解决我的这类问题?

我可能会引来一些批评,但让我用我理解的方式来解释你。我的理解是,这个问题/关注点更多的是架构的角度,而不是设计/代码的角度

即时一致性,当然还有最终一致性 来自应用层

对于两个数据库之间的
即时一致性
,实现它们的唯一方法是以事务方式执行
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

总结 我不认为考虑防故障的方法是明智的,相反,我们应该有一个系统,当涉及到提供两个不同数据源之间的一致性时,能够在尽可能快的时间内恢复

将系统解耦将大大有助于扩展和解决与数据正确性/质量相关的问题,同时将帮助您处理频繁的更新以及数据和更新的增长率

另外,我还推荐一种可以帮助你的方法


希望有帮助

我不认为你的问题是乐观/悲观。您的问题似乎与订单有关。例如,如果您保证了更新的顺序,那么简单地使用更新执行时间戳,并且仅当时间戳大于当前时间戳时才更新。当然,您的解决方案应该考虑得更周到。我建议阅读
事件来源
,这将更好地应用于此问题的解决方案,特别是当涉及到
最终一致的
商店时。想法是,你不应该关心商店的状态,而应该保证到达事件的顺序,那么最终你的商店将是一致的。