0%

3.简单Orleans查询功能例子

关于Orleans读写分离的简单例子

在使用Orleans框架的过程中,比较大的问题是Grains的查询。目前官方提供了Orleans.Indexing,介绍一个简单的基于AzureTable+Blob的查询功能例子:

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