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 并让它
- 坐在那里,保持联系或者
- 通过
tx-report-queue
或 监控运行操作
- 监控 t运行sactions 并打印在 t运行saction
中修改的所有实体的所有属性值
与上述每个测试 运行 并发,对等点 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 以空数据库开始
- 通过 [
tx-report-queue
] 监控 运行 操作
- 打印在每个 t运行saction
中修改的所有实体的所有属性值
- 每 4 秒查询一次数据库中的所有元素
- PeerB 每 6 秒执行一次上述 13kB 字符串属性更改和其他一些非常小的属性更改
- PeerA2 从填充的数据库开始,PeerB 仍在 运行ning
- 通过 [
tx-report-queue
] 监控 运行 操作
- 打印在每个 t运行saction
中修改的所有实体的所有属性值
- PeerA3 从填充的数据库开始,PeerB 仍在 运行ning
- 通过 [
tx-report-queue
] 监控 运行 操作
- PeerA4 从填充的数据库开始,PeerB 仍在 运行ning
- 除了连接到 datomic 和等待之外什么都不做
这里是(PeerA*s 的)rx 流量图表:
我是如何阅读图表的:
- t运行sactor 总是在提交时推送 tx 数据,无论 PeerA 是否对它感兴趣
- t运行saction 数据除了数据 "additions" 外还包含隐式撤回(这就是为什么启动 PeerB 后的第一个 t运行sactor 尖峰只有一半后来尖峰的大小 - 第一次还没有数据,因此没有什么可以收回的)
- 存储最初仅用于读取(从存储中的日志 - 而不是从索引 - 因为数据库中的数据总是比
memory-index-threshold=32m
少得多,即索引不会在测试期间启动)
- PeerA1查询数据库时不使用storage;事实上,查询不会产生任何明显的网络流量
- 启动对等点时的存储读取大小随着数据库增加数据而增长(不管数据是 "overwritten" -> 数据历史)
Datomic transactor pushes live changes to all connected peers to maintain a Live Index.
这是否意味着 所有被交易的数据 将始终发送到所有连接的对等点 - 是否对数据感兴趣?还是只是例如最近的数据库事务 ID?
根据经验得出的答案:是的,所有 t运行 操作(以及更多 *)的全部内容都流式传输到所有连接的对等点。
我确认通过将对等点 A 连接到 t运行sactor 并让它
- 坐在那里,保持联系或者
- 通过
tx-report-queue
或 监控运行操作
- 监控 t运行sactions 并打印在 t运行saction 中修改的所有实体的所有属性值
与上述每个测试 运行 并发,对等点 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 以空数据库开始
- 通过 [
tx-report-queue
] 监控 运行 操作
- 打印在每个 t运行saction 中修改的所有实体的所有属性值
- 每 4 秒查询一次数据库中的所有元素
- 通过 [
- PeerB 每 6 秒执行一次上述 13kB 字符串属性更改和其他一些非常小的属性更改
- PeerA2 从填充的数据库开始,PeerB 仍在 运行ning
- 通过 [
tx-report-queue
] 监控 运行 操作
- 打印在每个 t运行saction 中修改的所有实体的所有属性值
- 通过 [
- PeerA3 从填充的数据库开始,PeerB 仍在 运行ning
- 通过 [
tx-report-queue
] 监控 运行 操作
- 通过 [
- PeerA4 从填充的数据库开始,PeerB 仍在 运行ning
- 除了连接到 datomic 和等待之外什么都不做
这里是(PeerA*s 的)rx 流量图表:
我是如何阅读图表的:
- t运行sactor 总是在提交时推送 tx 数据,无论 PeerA 是否对它感兴趣
- t运行saction 数据除了数据 "additions" 外还包含隐式撤回(这就是为什么启动 PeerB 后的第一个 t运行sactor 尖峰只有一半后来尖峰的大小 - 第一次还没有数据,因此没有什么可以收回的)
- 存储最初仅用于读取(从存储中的日志 - 而不是从索引 - 因为数据库中的数据总是比
memory-index-threshold=32m
少得多,即索引不会在测试期间启动) - PeerA1查询数据库时不使用storage;事实上,查询不会产生任何明显的网络流量
- 启动对等点时的存储读取大小随着数据库增加数据而增长(不管数据是 "overwritten" -> 数据历史)