Streamstone是一个小型的嵌入式库,旨在基于Azure表存储构建可扩展的事件溯源应用程序。它具有简单的函数式风格API,深受Greg Young的事件存储的启发。
特性
- 完全符合ACID
- 支持乐观并发控制
- 重复事件检测(基于身份)
- 自动续传写入和读取(超过WATS限制)
- 可查询的自定义流和事件属性
- 同步(内联)投影和快照
- 支持内联投影的变更跟踪
- 适合多租户设计
- 分片支持(一致性哈希)
- 兼容.NET Standard 2.0和.NET Framework 4.6
通过NuGet安装
要通过NuGet安装Streamstone,请在NuGet包管理器控制台中运行以下命令:
PM> Install-Package Streamstone
从源代码构建
要在Windows上构建Streamstone二进制文件,你需要安装Visual Studio 17 Update 3或更高版本以及.NET Core SDK 2.0或更高版本。要在Linux上构建二进制文件,请使用dotnet cli工具(即dotnet build
)。
运行单元测试
Windows/Linux/MacOs
使用Azurite npm包来运行测试和示例应用,以模拟表存储服务。
警告:Azurite不能完全模拟Azure表存储功能,因此某些测试可能会失败。
注意:或者,你可以通过将存储帐户连接字符串设置为Streamstone-Test-Storage用户级环境变量来针对真实的Azure运行。
设计
Streamstone只是Windows Azure表存储之上的一个薄层(库,而非服务器)。它实现了处理事件流的底层机制,所有繁重的工作都由底层提供程序完成。
API是无状态的,所有暴露的对象在完全构造后都是不可变的。Streamstone不规定负载序列化协议,因此你可以自由选择任何你想要的协议。
乐观并发控制通过始终在每次写入时包含流头实体来实现,这使得在没有最新Etag的情况下无法向流追加内容。重复事件检测是通过自动为每个事件创建附加实体来完成的,其RowKey值设置为源事件的唯一标识符(一致的二级索引)。
架构
使用
基础
应用
演示
限制
虽然Streamstone允许你向Stream.Write
传递任意数量的事件,但Azure表存储施加的最大批处理大小限制为100个实体,因此:
- 每99个事件(100 - 1个头实体)将自动刷新批处理
- 每49个设置了id的事件(100/2 - 1个头实体)将自动刷新批处理
- 当尝试写入一个事件,其包含的内容超过最大批处理大小限制时,你将收到
InvalidOperationException
- 未考虑事件负载的实际字节大小,因此下面列出的所有限制仍然适用
Azure表存储API的其他限制:
- 批处理的最大大小为4MB
- 实体的最大大小为1MB
- 属性的最大大小为64Kb
- 属性名称的最大长度为255个字符
- 一个实体最多可以有255个自定义属性
社区
许可证
MIT许可证