问题标签 [akka-persistence]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
akka - 如何测试 Akka Persistence actor
我正在开发一个基于 Akka Persistent FSM 的项目。尤其是:
我想知道构建独立测试用例的最佳方法是什么?由于状态更改是持久的(这在文档中没有得到很好的解释,但可以在这里看到),确保我的持久参与者始终以干净的状态开始可能会很棘手。是否有必要手动将重置构建到我的演员 FSM 协议中?如果是这样,这似乎并不理想,因为它是需要自行测试的新行为。
在测试中管理期刊本身的最佳方式是什么?有没有一种简单的方法来配置使用不同的日志进行测试,而不必在角色设计本身中明确选择?文档的插件 TCK部分提到手动删除整个日志文件。这对于测试插件本身来说似乎是合理的,但对于应用程序代码来说,这似乎是一种不必要的低级解决方案。也许我需要在测试拆解中显式调用日志的asyncDeleteMessagesTo?这看起来仍然相当低级,但也许它只是尚未内置到库中的基础设施。
postgresql - 构建审计跟踪功能
以下是工作流系统中的一个用例
工单进入系统。工作订单将有一个目标,该目标在完成工作订单之前会经历不同的工作流程状态。
假设目标车辆的工作订单进入系统 - 此工作订单的工作流程涉及 2 个任务
a) 洗车
b) 检查车辆
假设清洗车辆工作流任务将车辆属性从“未清洗”更改为“已清洗”。并说“检查车辆”工作流任务将车辆属性“未检查”更改为“检查完成”
如果用户正在提取工作订单数据,用户将始终看到最新的车辆数据(在此示例中,假设两个工作流任务都已完成,用户将看到值“已清洗”和“检查完成”。但是,当用户仅提取工作流任务清洗车辆数据时 -> 用户将看到“已清洗”-虽然第二个任务已完成,但工作流任务 1 只会看到它已修改。获取工作流任务 2 的数据将同时看到“已清洗”和“检查完成”
这涉及数据的磨石(审计跟踪);一种方法如下图所示 - 当工作流任务修改数据时,它将更新版本号、modified_ts 并在其自己的数据行中维护该版本号(通过如下所示的 JOIN 表)。基本上,这只不过是维护对工作流任务数据的历史记录的引用,因此在提取工作流任务数据时,它知道要拉回哪个历史记录。请忽略parent_id
下图中的其他注意事项、噪音。这与这个问题无关。
我认为事件溯源也将是另一种替代设计 - 但是不想将事件溯源(或任何其他类似解决方案)作为一个整体销售解决方案应用,而仅适用于这个特定用例(仅影响 3 个左右的审计跟踪表事项)。我正在尝试评估 CQRS/事件溯源是否适合作为部分解决方案(再次仅限于需要保留历史记录/审计跟踪数据的 3-4 个表)或 ES/CQRS 是否会过大?还有其他想法吗?
PS 虽然这与 Scala 无关 - Scala 是我们正在使用的平台,因此对其进行标记以查看是否有特定于语言的解决方案可以提供帮助。标记 Akka 以通过 Akka 持久性找出 ES/CQRS 是否是一个选项。Postgresql 是一个数据库 - 而数据库触发器不是我正在寻找的解决方案。
cassandra - 无法通过 haproxy 连接到 cassandra 容器
我正在尝试将外部应用程序连接到在 mesos 集群上运行 dockerized 的 Cassandra。
这些是我在 mesos 上运行的应用程序:
名为peek的应用程序仅用于测试提案。我可以毫无问题地通过 URL:http: //192.168.56.101 :10001访问它。
2 个 cassandra 实例是一个种子,另一个用于扩展;形成一个集群。
marathon上cassandra应用部署的json描述如下:
/cassandra-种子
/卡珊德拉
haproxy 配置如下:
我试图连接到 Cassandra 的应用程序是一个 Play 应用程序。我是这样设置的:
该应用程序启动正常,但是当我尝试访问它时,出现以下错误:
有谁知道如何解决这一问题?我究竟做错了什么?
先感谢您...
更新==============================
有趣的是,我的应用程序的键空间已创建(akka,akka_snapshots):
更新2 ==============================
我刚刚注意到我什至无法将应用程序直接连接到正在运行的 cassandra(不通过 haproxy)。因此,我将 portMapping 更改为:
它奏效了。但是,由于 servicePort 声明,它只允许我启动一台机器。
问题出在端口映射中。有什么线索吗?
akka - Akka Persistence - LevelDB 中未发生删除
持久性 Actor 一次接收一条消息。在持久化 100 条消息后,它应该将这 100 条消息发送到目标 Actor。我打算在保存快照后删除这些消息。
我在每 50 条消息后进行快照。我在收到 SavingSnapshotSuccess 后删除消息。但删除不会发生。我仍然在附加的日志中看到这些消息。没有收到 DeleteMessagesSuccess/Failure 消息。在删除快照时也没有收到 DeleteSnapshotsSuccess/Failure。
以下是版本:
代码:
akka - akka 持久性是否比我在 redis 中存储消息状态更好?
我目前喜欢将 redis 与 akka 一起使用,因为我可以通过查询 redis 来监控已处理的消息。Redis 也持久化到磁盘。
akka 持久性与仅使用 redis 相比如何?
docker - 无法连接到 cassandra 集群,但可以连接到单节点?
在尝试将外部 Play 应用程序连接到 cassandra 集群(在 mesos 上的 docker 容器上运行)时,我在这里遇到了一些奇怪的情况。
问题是:
如果我只有一个 Cassandra 节点,我可以从 Play 应用程序正确连接到它。但是,如果我向其中添加第二个节点,我将无法再连接到任何节点。
我将节点设置如下:
第一个节点(种子)
此时,我可以将 playy 应用程序连接到 cassandra-seed。
卡桑德拉节点2
此节点启动后,我无法连接到它,也无法连接到 cassandra-seed。
nodetool状态结果:
看起来在第二个节点启动后,cassandra 没有绑定到该地址,并且主机不再看到它。我应该怎么办?
scala - 实现“实时”流来驱动 Akka 2.4 持久性查询
我一直在研究实验性的 Akka Persistence Query 模块,并且对为我的应用程序实现自定义读取日志非常感兴趣。该文档描述了两种主要的查询方式,一种返回日志的当前状态(例如CurrentPersistenceIdsQuery
),另一种返回可订阅的流,当事件通过应用程序的写入端提交到日志时发出事件(例如AllPersistenceIdsQuery
)
对于我设计的应用程序,我使用 Postgres 和 Slick 3.1.1 来驱动这些查询。我可以通过执行以下操作成功地流式传输数据库查询结果:
但是,一旦底层 Slick DB 操作完成,就会通知流完成。这似乎无法满足能够发出新事件的永久开放流的要求。
我的问题是:
- 有没有办法纯粹使用 Akka Streams DSL 来做到这一点?也就是说,我可以发送一个无法关闭的流吗?
- 我已经对 LevelDB 读取日志的工作方式进行了一些探索,并且它似乎通过让读取日志订阅写入日志来处理新事件。这似乎是合理的,但我必须问 - 一般来说,有没有推荐的方法来处理这个要求?
- 我考虑过的另一种方法是轮询(例如,定期让我的阅读日志查询数据库并检查新事件/ID)。比我更有经验的人能提供一些建议吗?
谢谢!
scala - 使用 eventsByPersistenceId 逆序获取事件源
我有一个PersistentActor
事件persist
,我想以相反的顺序阅读它们。更具体地说,我想Source
为以相反顺序发出事件的事件获取一个。这对于回答有关为此发生的最后 N 个事件的查询很有用PersistentActor
。这个问题的正确方法是什么?这些信息应该缓存在视图中,或者有一种方法可以让我以相反的顺序懒惰地查询事件?
谢谢!
testing - 如何在单元测试中杀死并重新启动 akka 持久性参与者以查看它是否保留状态
在我的单元测试中,有没有办法杀死并重新启动持久性参与者以检查它是否可以正确保留状态(例如,事件序列化/反序列化工作正常)?