Datomic 是否将所有交易发送到 "commit" 上的所有连接点?

Does Datomic ship all transactions to all connected peers on "commit"?

Datomic transactor pushes live changes to all connected peers to maintain a Live Index.

这是否意味着 所有被交易的数据 将始终发送到所有连接的对等点 - 是否对数据感兴趣?还是只是例如最近的数据库事务 ID?

根据经验得出的答案:是的,所有 t运行 操作(以及更多 *)的全部内容都流式传输到所有连接的对等点

我确认通过将对等点 A 连接到 t运行sactor 并让它

  1. 坐在那里,保持联系或者
  2. 通过tx-report-queue
  3. 监控运行操作
  4. 监控 t运行sactions 并打印在 t运行saction
  5. 中修改的所有实体的所有属性值

与上述每个测试 运行 并发,对等点 B 将执行 4 t运行saction,其中每个 t运行saction 将更改几个简单的属性单个实体,其中一个属性是大约 5k 运行dom 字符串数据,其他属性只是非常短的字符串。

Wireshark 捕获了 Peer A 和 t运行sactor 之间的 TCP 连接,tcp 转储的 总字节大小可以在下面看到 table.

━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━
  case  tx-report-queue  print  bytes (5kB)  bytes (13kB) 
──────────────────────────────────────────────────────────
     1                                61348        127996 
     2  ✓                             61800        128084 
     3  ✓                ✓            61260        127652 
──────────────────────────────────────────────────────────
 no-tx                                13076         12988 
━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━

相对转储大小相差不到 500 字节,这远远小于 4 个提交的 t运行 操作中的一个,每个操作的更改超过 5kB。

然后我也 运行 测试没有做任何 t运行sactions,然后 tcp 转储将缩小到大约 13kB。因此,我认为它是 t运行saction 数据被 t运行smitted.

*) 粗略:t运行每 t运行sactor<- >PeerA 数据约为 (61kB-13kB)/4tx = 12kB/tx。因此看起来当更改 属性 时, 缩回(该字符串为 5kB)和添加(再次为 5kB)都是通过 t运行 发送的 t运行 sactor 的实时索引,这将提供大约 10kB,加上 2kB 的小空间用于其他(小得多)修改的属性,(加上更多的心跳,每 5 秒发生一次并添加一些 300 字节,在执行 t运行 次操作的测试用例中,只是因为我花时间 运行 这些测试)。

编辑 为了让我的推论有更坚实的基础,我用 13kB 的字符串而不是原来的 5k 重新运行 进行了测试。结果(添加到 table)似乎证实了我的理论:现在每 t运行saction 成本约为 (128kB-13kB)/4tx = 29kB/tx,因此 13kB 回缩 + 13kB 添加 + 3kB 松弛。


进一步编辑 我运行 进行更多测试,绘制各个 PeerA* 接收到的字节图。来自 t运行sactor 的流量(通过单个 TCP 连接完成)和来自 datomic:free://(即 H2)存储的流量,在所有情况下都涉及三个 TCP 连接到相同的 H2 端口。

我忽略了 t运行sactor 和存储方向的 TCP 流量,这要少得多。

  • PeerA1 以空数据库开始
    1. 通过 [tx-report-queue]
    2. 监控 运行 操作
    3. 打印在每个 t运行saction
    4. 中修改的所有实体的所有属性值
    5. 每 4 秒查询一次数据库中的所有元素
  • PeerB 每 6 秒执行一次上述 13kB 字符串属性更改和其他一些非常小的属性更改
  • PeerA2 从填充的数据库开始,PeerB 仍在 运行ning
    1. 通过 [tx-report-queue]
    2. 监控 运行 操作
    3. 打印在每个 t运行saction
    4. 中修改的所有实体的所有属性值
  • PeerA3 从填充的数据库开始,PeerB 仍在 运行ning
    1. 通过 [tx-report-queue]
    2. 监控 运行 操作
  • PeerA4 从填充的数据库开始,PeerB 仍在 运行ning
    1. 除了连接到 datomic 和等待之外什么都不做

这里是(PeerA*s 的)rx 流量图表:

我是如何阅读图表的:

  • t运行sactor 总是在提交时推送 tx 数据,无论 PeerA 是否对它感兴趣
  • t运行saction 数据除了数据 "additions" 外还包含隐式撤回(这就是为什么启动 PeerB 后的第一个 t运行sactor 尖峰只有一半后来尖峰的大小 - 第一次还没有数据,因此没有什么可以收回的)
  • 存储最初仅用于读取(从存储中的日志 - 而不是从索引 - 因为数据库中的数据总是比 memory-index-threshold=32m 少得多,即索引不会在测试期间启动)
  • PeerA1查询数据库时不使用storage;事实上,查询不会产生任何明显的网络流量
  • 启动对等点时的存储读取大小随着数据库增加数据而增长(不管数据是 "overwritten" -> 数据历史)