关于Orleans读写分离的简单例子
在使用Orleans框架的过程中,比较大的问题是Grains的查询。目前官方提供了Orleans.Indexing,介绍一个简单的基于AzureTable+Blob的查询功能例子:
- index实时写入Azure Table(分散):WriteOnlyIndexService
- 定时MergeTable中的数据到Azure Blob(以固定时间(小时/天))为单位,例如:2019112514.json: ReadOnlyIndexGrain以时间为主键。
- 查询的时候需要给定时间范围,如2019112508-2019112510,激活对应的readonlyIndexGrain,执行查询,可使用类似DynamicExpresso或System.Linq.Dynamic.Core等类库帮助执行查询。
- 注意AzureTable的单Partition的IOPS最高2000trans/s如果需要较高的IOPS,建议muti-Partition。
- Muti-Partition的问题在于TableScan的性能和费用问题需要注意。
- 如果索引量过于巨大,可能会导致在时间段的后端由于状态保存的网络IO耗时较长 ,导致性能下架。可以考虑以下办法,可以尝试让单个ReadOnlyIndexGrain下有多个子Grain,类似RollingFile的方式,通过Size控制数量,减少GrainState持久化到AzureBlob的消耗,也可以手动压缩对应的索引State。