Orleans 2.0 官方文档 —— 4.7 Grains -> 请求的上下文

请求的上下文

RequestContext是一种Orleans功能,它允许应用程序元数据(如跟踪ID)随请求一起流动。应用程序元数据可以添加到客户机上;它会与Orleans 请求一起流向接收方的grain。

该功能由Orleans命名空间中的公共静态类RequestContext实现。此类公开了两个简单的方法:

void Set(字符串键,对象值)用于在请求上下文中存储值。该值可以是任何Serializable类型。Object Get(字符串键)用于从当前的请求上下文中检索值。

RequestContext的后备存储是线程静态的。当线程(无论是客户端还是在Orleans内)发送请求时,发送线程的RequestContext的内容,都包含在请求的Orleans消息中; 当grain代码接收到请求时,可以从本地的RequestContext访问该元数据。如果grain代码没有修改RequestContext,那么它所请求的任何grain,都会收到相同的元数据,依此类推。

当您使用StartNew或ContinueWith来创建计划执行的延续代码时,应用程序元数据也会被保留。在这两种情况下,执行延续代码时,所使用的元数据,会和创建计划时的元数据相同。(即,系统制作当前元数据的副本,并将其传递给延续代码,因此在调用StartNew或ContinueWith之后元数据的变化,会被延续代码给忽略)。

请注意,应用程序元数据不会随响应一起返回; 也就是说,收到响应后运行的代码(无论是在一个ContinueWith的延续代码内,还是在调用Wait或GetValue之后),仍将在原始请求设置的当前上下文中运行。

例如,要将客户端中的跟踪ID设置为新的GUID,只需调用:

RequestContext.Set("TraceId", new Guid());

在grain代码(或者是在Orleans中运行在调度计划线程上的其他代码)中,可以使用原始客户端请求的跟踪ID,例如,在编写日志时:

Logger.Info("Currently processing external request {0}", RequestContext.Get("TraceId"));

虽然任何可序列化对象都可以作为应用程序元数据发送,但值得一提的是,大型或复杂对象可能会给消息序列化时间增加明显的开销。因此,建议使用简单类型(字符串,GUID或数字类型)。

你可能感兴趣的:(Orleans)