在有状态服务中全局访问数据

时间:2017-01-13 17:57:37

标签: azure-service-fabric service-fabric-stateful

我将用户信息作为每次调用状态服务的一部分传递。我在服务中将此信息用于审计目的。

我是否必须在服务中传递此信息,或者是否有其他一些机制(如用户上下文)来保存我可以全局访问的数据?我过去曾使用线程存储(数据插槽)来保存数据,但由于代码是异步的,我认为这不起作用?

2 个答案:

答案 0 :(得分:1)

有一个名为CallContext的概念,可以提供帮助。在此处阅读更多内容:http://blog.stephencleary.com/2013/04/implicit-async-context-asynclocal.html

答案 1 :(得分:1)

您无法将该信息保留在服务中的某个成员中,因为您无法控制多个线程上的并发调用的执行方式。运行时允许任务和异步方法之间“跳转”的方式意味着ThreadStorage不是保持该上下文的安全方式。

您需要的是从ServiceRemotingDispatcher到执行实际服务方法的所有方式,并且不受并发调用(可能是同一方法)的影响。底层Service Fabric实现执行方法的方式意味着有多个Task和async方法被调用,这也意味着简单地基于此,Thread id作为一个选项是不可能的,因为它几乎可以保证跳转在您到达代码之前至少进行一次线程。

我写了一个类似的问题this answer(已被删除,所以我自己添加了这个q)。它基本上解决了您的问题,它基于CallContext mentioned by @LoekD

相关问题