0

我会尽力解释情况,但如果我不清楚,请提出任何问题。

我的情况:我有两台计算机,A 和 B。在计算机 A 上,我有一个程序可以查看数据库并将其显示给用户。在计算机 B 上,我有一个程序,其中用户的各种操作导致数据最终进入所述数据库(通过许多第三方应用程序进行的非常间接的过程)。

我的“目标”:我需要从对 B 执行操作的时间开始计算,我需要多长时间才能从 A 上的程序访问该数据。理想情况下,我需要将其缩小到50ms 的误差范围。

工具:

  • 计算机 A 和 B 共享本地连接
  • 它们可以通过 TCP 进行通信——我以前使用 C# 进行这种通信。我知道这样说不准确,但是我们可以有效地将通信时间 B->A 和 A->B 视为常数(但每个方向都是自己的常数)
  • 他们可以访问共享的 NTFS 格式的网络驱动器。
  • 我可以在 B 上以可忽略的程度判断(为此目的,O(n) 实际上为零),当执行该操作时
  • 当一个值可以从 A.

约束/障碍

  • 计算机 B 无法访问 Internet
  • 不能相信时钟是同步的——即使当前时间看起来是同步的。我已经看到两台计算机上的时钟以分钟为单位相互偏离。我不知道网络驱动器上的时间戳是如何确定的。
  • 虽然 TCP 通信中的有效时间对我来说是恒定的,但我不知道这些常量(A->B 和 B->A)是什么或如何测量它们。
  • 操作和检索发生在第三方程序中,数据库是另一个数据库的反映,我无法访问这些值所在的服务器。
  • (编辑/添加)计算机 B 不知道数据何时进入数据库,只有当将其放置在那里的动作触发时才知道。

我认为这最终会变成某种数学问题,我会以某种方式使用每台计算机消息的时间戳差异,而不是比较计算机之间的时间戳。因此,更多的是测量 TCP 通信工作需要多长时间,而不是查看该过程需要多长时间。如果我有,我可以在事件发生时从 B 向 A 发送消息,在数据可用时从 A 向 B 发送消息,然后减去通信时间。如果这是我最好的选择,我不知道我将如何设置它,实际上或理论上,因为我不能相信他们自己的时间戳。

此外,虽然我会非常感谢一些回应/答案/想法 - 老实说,这是我写作的一部分,这是为了让我清楚地描述和思考这个问题。此外,我找不到这个问题的答案,所以如果其他人在路上遇到类似的问题,希望这会弹出。

4

1 回答 1

0

我无法从你写的内容中得到你的实际环境,但是:

基本要求是:

  • 有一个可供 A 和 B 访问的共享时间服务器。
  • 为 B 产生的事件/记录分配时间。
  • A 上事件/记录的查找时间。

如果其中一个无法提供,我想没有办法解决。

如果本地计算机时间不能同步足够准确,您需要设置自己的时间服务器。我会:

编写一个在 B 上运行的时间服务器,例如使用 Win32::GetTickCount 作为当前时间。

通过 tcp 连接(或更准确地说:串行连接)使 A 可以访问 B 的当前时间。

将时间存储在 B 上产生的记录/事件中

当在 A 上检测到新记录/事件时,从记录获取时间并通过 TCP 连接从 B 获取当前时间。

区分时间并获得结果。(里面没有大数学)

您也可以使用网络驱动器作为传输当前时间的通道,但我猜同步文件访问有点棘手。我猜TCP连接更容易建立。

也许使用 NAS 中的“LastWriteTime”可能是另一种获取共享时间的方法。如果一切正常,您可以在 B 上连续写入文件并在 A 上获取文件的 LAstWriteTimeSTamp。这可能是您的时间服务器。

您可能想了解如何在两台计算机之间建立 TCP 连接,或者研究如何分配/请求 NAS 中文件的 LAstWriteTimestamp。

类似于:在 B 上: File.WriteAllText("\nas\timestamp.txt", Guid.NewGuid()); 在 A 上:aTimeStamp = new FileInfo("\nas\timestamp.txt").LastWriteTime 也许是 LAstWriteTimeUTC。

您需要检查 LastWriteTime 和通过 nas 的延迟是否对您来说足够准确。

希望那些对你有帮助。

于 2018-09-19T16:13:55.637 回答