我使用sqlserver作为后端,在akka.net中使用持久性角色。
有没有可能用sqlserver持久化配置Akka.net,使其持久化使用文本有效负载,而不是现在的varbinary?
发布于 2016-07-22 14:52:42
您不能将有效负载作为文本而不是VarBinary进行持久化,因为Akka.Persistence.SqlServer使用了akka序列化机制,该机制试图为您的有效负载类型找到具体的序列化程序,该序列化程序将把您的消息序列化为字节数组,并将其存储到数据库中
var serializer = Serialization.FindSerializerFor(e.Payload);
var binary = serializer.ToBinary(e.Payload);
AddParameter(command, "@Payload", DbType.Binary, binary);发布于 2018-03-09 08:05:28
简单的答案是不,真正的答案是你能做到。你需要编写自己的扩展,持久化插件。(我为Redis写了一个)。我还没有把它发布在GitHub上,因为它是我工作的公司的专利,但你可以看看这里,例如:
看一看here for extra classes you need to implement
YourPersistenceExtension: IExtension{ ... }
YourExtensionProvider: ExtensionIdProvider<YourPersistenceExtension>{ ... }我会给你一个非常简短的路线图,但在此之前:
Akka.Persistence包含两种类型的存储:
您可以只实现Journal,如果这适合您的需要,您不必使用快照(但建议您这样做,但对于本答案的目的,它并不重要)。
为了实现日志,您需要从Akka.Persistence.AsyncWriteJournal派生
在这里,您可以实现将事件写入/读取到SQL Server (或您选择的任何其他数据存储)的要求,您只需读取/写入您想要的任何内容,并对其进行管理。例如,在redis中,我使用排序集,因为我的参与者包含唯一的Id,所以我能够将与特定参与者相关的所有持久性事件分组到与该Id对应的单个值(排序集)中。这一点很重要,因为您希望快速而简单地恢复参与者的所有事件。此外,基类AsyncWriteJournal包含使用序列顺序表示法的方法,因此使用排序集是很自然的。在实现持久性扩展时,您应该使用这些注意事项。
文档可以在这里找到:AsyncWriteJournal
您将需要使用您的类型、名称空间来配置hocon文件中日志的使用,就像您使用其他类型的数据存储配置一样。
一旦你配置了你的Journal Akka将使用你的插件在从你的PersistentActor (或派生类型)调用Persist/PersistAsync时持久化状态/事件。
我知道这听起来有点夸张,但它真的不是,特别是我在这里解释的路线图和我给你的参考,这取决于你是否真的需要它。
https://stackoverflow.com/questions/38346696
复制相似问题