如何合并来自不同设备的用户生成数据?

时间:2013-11-01 06:19:07

标签: web frameworks merge

当一个用户使用多个设备离线或在线生成数据时,如何合并它并尽可能避免冲突?

就像我制作了一个具有离线容量的几个阶段的游戏。一位用户迈克已经在iPad上以第123阶段的离线状态进入第二阶段,但现在他转移到他的iPhone并发现他仍然处于第一阶段。因此他再次进入第一阶段并以得分321进入第二阶段。他的设备都连接到互联网,我们希望将这两个设备同步到一个状态。我们可以这样做:

  • 用户单击两个设备上的同步按钮,应用程序停止
  • 所有设备都会将所有用户数据(分数,阶段......)推送到其中
  • 服务器将用户数据与上次修改时间合并
  • 所有设备都会提取合并数据
  • 应用程序返回首页并恢复以避免不一致

此解决方案依赖于自己的应用程序。是否有任何解决方案可以使用户数据同步对应用程序透明?

3 个答案:

答案 0 :(得分:1)

当几个用户编辑同一个文档时,听起来像是一种协作的东西。

首先,让我们看看应该如何实施协作事项:

  • 必须将客户端事件发送到服务器
  • 服务器设置事件的顺序,
  • 服务器在数据上应用事件,
  • 服务器将数据更改发送给客户端。

如果服务器始终可访问,它运行良好。我写了一个协作电子表格,很高兴看到,当我输入1.9999999进入单元格时,它变为2.00,因为1.9999999只是一个事件,服务器处理并从中发送了2.00数据并发回。

如果没有可用的服务器7/24,您应该

  • 保留数据的本地副本
  • 使用草稿事件 - >数据转换,
  • 显示草稿数据,直到服务器发送官方数据。

在大多数情况下,官方数据和草案数据是相同的,甚至没有必要警告用户,他或她可以看到的是临时数据。

主要技巧是

  • 事件应该有时间戳,
  • 客户的时间必须同步。

因此,当服务器从假日回来时,它将能够以正确的顺序重新播放事件。此外,当另一个客户端在脱机时段之后加入并且它发送过去的事件时,服务器必须重新运行来自其他客户端的一些过去事件以获得正确的最终数据计算。

您可能永远不会确定服务器是否收集了所有事件。你必须制定一个战略,如何应对来自远方的事件。也许放弃它们?

有些情况,比如高分,顺序并不重要。

答案 1 :(得分:0)

我认为最好的解决方案是不要求两台设备同时连接到互联网,同时按下按钮。

你可以这样做:

  1. 启动时,应用程序会检查是否存在Internet连接。如果没有,则根据自己的数据启动,否则将用户数据推送到服务器。
  2. 当服务器从设备获取用户数据时,它会进行合并:在您的情况下,它应该检查阶段是否高于它已经知道的阶段:如果不是,那么只是忽略新接收的数据,否则覆盖现有数据与新收到的数据。
  3. 如果数据已更新,服务器会将新数据广播到所有连接的设备(这可能发生在游戏中)。
  4. 如果服务器不知道连接的设备,则步骤3无效。解决方案是更改步骤1,以便在启动时应用程序将用户数据推送到服务器(立即执行合并),然后从服务器查询用户数据(可能获得相同或更高的阶段)并启动基于收到的任何东西。

答案 2 :(得分:0)

在服务器上使用transactional database

来自维基百科:

  1. 开始交易
  2. 执行一组数据操作和/或 查询
  3. 如果没有发生错误,则提交事务并结束它
  4. 如果发生错误,则回滚事务并结束它
  5. 基于服务器的数据库是客户有效信息的主要来源。当客户想知道最新分数时,他们会查询数据库。在您的客户端上,您可以跟踪local_scoreremote_score。您向用户显示的内容为local_score+remote_score,但是当您向服务器提交分数更新时,您只需提交为该游戏的该实例获得的部分({{1} })。心态是你只发送增量。您的数据库只是将它收到的任何新分数添加到其内部总数中,并以上面显示的事务方式进行。

    请注意,数据库将按顺序排列并发请求并按顺序执行,因为它会在事务发生时锁定数据库的相关部分。你可以自己构建这个逻辑,但是有很多goodfree databases,你可以使用其中一个。

    此策略允许您的客户端在服务器更新时保持最新状态,同时将服务器的责任推送到有关游戏状态的权威信息来源。当然,您不仅可以使用分数执行此操作,还可以使用任何需要在多个客户端中跟踪的内容。