Akka 集群分片:分片实体共享日志吗?

Akka cluster sharding: do shard entities share a journal?

我正在关注一个 akka tutorial demonstrating cluster sharding. In the cluster sharding example,作者启动了一个共享日志并发表了以下评论:

// Start the shared journal one one node (don't crash this SPOF)
// This will not be needed with a distributed journal

使用的期刊is

journal.plugin = "akka.persistence.journal.leveldb-shared"
  1. 为什么分片实体共享一个日志?我的理解是 Akka 持久性不支持多次写入但支持多次读取。共享日志的必要性是什么?我的印象是每个坚持不懈的演员都有自己的日记。为什么非共享 LeveldbJournal 不支持分发读取?这样做有什么困难吗?

  2. 本教程基于 Akka 2.4,在此版本中,集群分片使用 persistence 作为 akka.cluster.sharding.state-store-mode 的默认值。在此示例中,哪个组件确切地使用了 snapshop/journal 支持?它是不同分片中的 Persistent actor 还是关于与其复制相关的分片信息?究竟需要分发什么?我发现相关文档含糊不清。

  3. 如果我只有一个分片,我需要分布式日志吗?

  4. 一个有点相关的问题:我有 reimplemented the now deprecated PersistentView based on PersistenceQuery。我可以在日志中查询来自 persistentActor 的事件,并设置一个流来接收它的持久化事件。我已经测试过它并且有效。但是,在我的测试环境中,我无法使用 InMemoryJournalStorage(我认为这不是分布式日志)接收分片参与者中的事件。在我的测试场景中,我只有一个分片和一个演员,我使用唯一的 persistenceId 演员来查询它,但我在读取端没有收到任何事件。关于让 Akka 持久性与集群分片一起工作,我缺少什么吗?我应该 append/prepending 用于查询事件的 persistenceId 吗?

  1. 它们不应该,至少在生产代码中不应该,请参阅此处的警告说明: http://doc.akka.io/docs/akka/current/java/persistence.html#shared-leveldb-journal

A shared LevelDB instance is a single point of failure and should therefore only be used for testing purposes.

  1. 两者

  2. 是的,如果您希望故障转移起作用。如果您不想要故障转移并且您只有一个分片,那么使用分片根本就没有意义。

  3. 不看你的一些代码就无法判断。