是否有众所周知的跨服务器场同步任务的最佳实践?例如,如果我有一个基于论坛的网站在服务器场上运行,并且有两个版主试图执行一些需要写入数据库中的多个表的操作,并且这些版主的请求正在由服务器中的不同服务器处理农场,如何实现一些锁定功能以确保他们不能同时对同一个项目执行该操作?
到目前为止,我正在考虑使用数据库中的表进行同步,例如检查表中项目的 ID,如果不存在则插入并继续,否则返回。也可能为此使用共享缓存,但我目前没有使用它。
还有什么办法吗?
顺便说一句,我使用 MySQL 作为我的数据库后端。
是否有众所周知的跨服务器场同步任务的最佳实践?例如,如果我有一个基于论坛的网站在服务器场上运行,并且有两个版主试图执行一些需要写入数据库中的多个表的操作,并且这些版主的请求正在由服务器中的不同服务器处理农场,如何实现一些锁定功能以确保他们不能同时对同一个项目执行该操作?
到目前为止,我正在考虑使用数据库中的表进行同步,例如检查表中项目的 ID,如果不存在则插入并继续,否则返回。也可能为此使用共享缓存,但我目前没有使用它。
还有什么办法吗?
顺便说一句,我使用 MySQL 作为我的数据库后端。
您的问题暗示数据级并发控制——在这种情况下,使用 RDBMS 的并发控制机制。
如果稍后您希望控制不一定一对一映射到数据实体(例如表记录访问)的应用程序级操作,那将无济于事。一般的解决方案是有一个反向代理服务器,它理解应用程序级别的语义并在必要时进行相应的序列化。(这将对可用性产生负面影响。)
阅读 CAP 定理可能也不会有什么坏处!
您可能想要研究分布式锁定服务,例如Zookeeper。它是 Google 服务的重新实现,可为应用程序提供非常高速的分布式资源锁定协调。不过,我不知道将其整合到网络应用程序中会有多容易。
如果所有状态都在(中央)数据库中,那么数据库事务应该为您处理这些。
它可能对你无关紧要,因为这个问题很老,但它仍然可能对其他人有用,所以我还是会发布它。
您可以在锁定对象上使用“SELECT FOR UPDATE”数据库查询,因此您实际上使用数据库来实现锁定机制。
如果你使用 ORM,你也可以这样做。例如,在 nhibernate 中,您可以执行以下操作:
session.Lock(Member, LockMode.Upgrade);
拥有一张锁表是一种不错的方法,它既简单又有效。
您还可以将代码作为单一服务器上的服务,更像是一种 SOA 方法。
您还可以将 TimeStamp 字段与 Transactions 一起使用,如果自上次获取数据以来时间戳已更改,您可以恢复事务。因此,如果有人先进入,他们就有优先权。