一个数据库,多个前端,维护请求排序

时间:2011-03-01 03:33:36

标签: database architecture

假设我有一个数据库保持一个简单的历史记录,多个前端与它交谈(每个服务器一个前端),我想知道什么是处理时间的常见解决方案。一旦我有多个服务器,我就不能假设全局一致的时钟,我对可能的解决方案感兴趣,以保持请求之间的某种顺序。

对于一个具体的例子,假设我想记录客户的历史记录,其中历史记录被定义为时间有序的记录集。记录表就像(customer_id,time,data)一样简单,历史记录将是customer_id == request id的所有行。用户发送的每个请求都包含发送给一个客户的一条记录。理想情况下,时间应该是指客户将请求发送到前端的“实际”时间(因为这是从用户POV看到的时间)。确切地说,我只关心保留每个客户的记录之间的顺序,而不是绝对时间。

我知道矢量时钟等解决方案......但这看起来相当复杂,我希望这是一个相当普遍的问题?

在我的案例中不可接受的解决方案:

  • 更改到达前端的请求:遗憾的是,我必须在请求按原样传递的约束下工作。但我完全控制了前端和数据库之间所需的任何通信协议。
  • 服务器时钟已同步
  • 所有需要相互订购的请求均由同一台前端服务器处理

[编辑]:问题可能听起来有点像红鲱鱼,所以这是我的理由:虽然现在这不是我的问题,但我有兴趣去像Google App这样的平台引擎,明确表示他们的服务器不能保证时间同步。请求排序问题的解决方案对我来说并不明显 - 但是像矢量时钟这样的东西实际上是唯一的“好”解决方案吗?

2 个答案:

答案 0 :(得分:0)

  

一旦我有多台服务器,我   不能假设全球一致   时钟

那么,您可以配置服务器以将其时钟同步到时间服务器。您还可以将数据库服务器配置为同步到时间服务器,并根据需要将其他服务器配置为同步到数据库服务器。 (我不是说这是一个好主意,只是说它是可能的。如果你有权访问所有服务器。)

无论如何。 。 。因此,前端是您在请求到达时实际知道的唯一软件。是吗?

如果这是正确的,那么记录客户请求的时间(可能是UTC),然后将该时间戳转发到数据库是前端工作。

如果您无法同步服务器的时钟,那么我认为您唯一的希望是让每个前端只询问一个特定的服务器 - 可能是您的数据库服务器,但可能不是 - 客户请求的时间是什么时候到达。前端可以通过在端口13(DAYTIME协议,RFC-867)上请求白天,在端口37上请求时间(TIME协议,RFC-868)或在端口123上询问时间服务器(NTP或SNTP)来做到这一点协议,RFC-1305和RFC-2030)。

但在阅读完编辑后,我认为你想要的是不可能的。你似乎在说那个

  • 前端发送的不是 包含足够的信息 重建“真正的”排序
  • 前端发送的不可能 改变

如果前端无法向您发送任何其他信息,矢量时钟和间隔树时钟将无济于事。

答案 1 :(得分:0)

当您执行将历史数据记录到数据库的任何操作时,您可以记录两组日期时间信息:

  • 插入记录时由DB设置的日期时间
  • 将数据作为合法元数据传递的日期时间。

如果您需要,前者会给您一个世界的中心视图,后者可以让您从客户的角度重建日期时间。

如果你非常敏锐,你也可以通过使用JavaScript填充某种参数/字段来从用户浏览器传递日期时间。