【问题标题】:Create stream and grain with the same name in Orleans在奥尔良创建同名的流和谷物
【发布时间】:2021-10-21 16:43:48
【问题描述】:

我有一个使用字符串键的谷物。我希望这个grain能够引用同名的流。

public class StreamGrain : Grain, IGrainWithStringKey
{
  protected IAsyncStream<IPointModel> _dataStream = null;
  protected IAsyncStream<ITransactionModel> _actionStream = null;

  public override Task OnActivateAsync()
  {
    var identity = this.GetPrimaryKey(); // this.GetPrimaryKeyString();
    var streamProvider = GetStreamProvider("Inputs");

    _dataStream = streamProvider.GetStream<IPointModel>(identity, "Points");
    _actionStream = streamProvider.GetStream<ITransactionModel>(identity, "Transactions");

    return base.OnActivateAsync();
  }
}

同时,当我尝试使用GetPrimaryKey 将grain 与流连接时,我得到了error,因为grain 使用字符串作为键,而不是GUID。同时,奥尔良的流似乎只能由 GUID 引用。因此,无法使用相同的名称来调用grain 和相关流。

问题

如何使用相同的名称连接grain 和stream?换句话说,无论一个grain被激活或停用多少次,我都想获得对同一个流的引用。

【问题讨论】:

    标签: orleans


    【解决方案1】:

    目前看来,奥尔良的流只能由 GUID 引用。 Orleans 团队提到,可能会在下一个版本中添加为流提供字符串名称的功能。现在,这是将字符串颗粒名称与流的 GUID 相匹配的 hacky 方法。

    String => MD5 => GUID
    
    public override Task OnActivateAsync()
    {
      using (var provider = MD5.Create())
      {
        var name = this.GetPrimaryKeyString();
        var streamProvider = GetStreamProvider(nameof(NameEnum.Inputs));
        var identity = new Guid(provider.ComputeHash(Encoding.ASCII.GetBytes(name)));
    
        _dataStream = streamProvider.GetStream<IPointModel>(identity, nameof(NameEnum.Points));
        _actionStream = streamProvider.GetStream<ITransactionModel>(identity, nameof(NameEnum.Transactions));
      }
    
      return base.OnActivateAsync();
    }
    

    欢迎提出更好的建议。

    【讨论】:

      猜你喜欢
      • 2021-06-10
      • 1970-01-01
      • 2019-01-05
      • 2020-12-15
      • 1970-01-01
      • 1970-01-01
      • 2016-02-28
      • 1970-01-01
      • 2019-04-04
      相关资源
      最近更新 更多