Home
Last updated
Was this helpful?
Last updated
Was this helpful?
– library for spreading the context across the . It also supported spreading the context across the network.
When the code is executed, asynchronous control flow is built. Sometimes we want to spread some context at the tree. For example, we want to have to access information about a user or tracing by default.
Consider the following situation: A user had come in our service. We know something about him. For example, we know his id. Control flow looks like this:
Handle() ....Method1() ........Method2() ............ – ................MethodN()
We want to have to access information about the user at every level of asynchronous control flow. But at the same time, we wouldn't need to throw this data explicitly.
For example, we want to say: "UserId is xxx now" in Handle()
and get UserId in MethodN()
:
Handle() <------- Context.Put ("UserId", xxx) ....Method1() ........Method2() ............ – ................MethodN() <------- Context.Get("UserId")
If the code is running in one thread, we can use thread local storage. Just put local for current thread data in this storage. But what if the code is asynchronous and we still want general context?
Microsoft created a solution – .
Context is more user-friendly wrapper above the AsyncLocal. The main value of Vostok-Context is integration with other Vostok's libraries. For example, if you use + , you can automatically spread the context across the network. (Not just in a current asynchronous stream.)
By way of illustration: A user has come in our service, and we know his id. But calls go through another service unlike the example above. It looks like this:
Service1 Handle() ....Method1() ........Method2() ............ – ................MethodN() | | HTTP request | \/ Service2 Handle() ....Method1() ........Method2() ............ – ................MethodM()
We want to have access to information on the user at every level of asynchronous control flow in the Service2.
You can spread the context across the network with Vostok.Context + ClusterClient. The function of the Context is serialization and deserialization of disseminated data. Use model, connecting ClusterClient and Context – to send context over the network.
There are two different interfaces in Context:
Interface
Description
Represents mutable type-based ambient context properties. These properties are global in a sense that they can only hold one value of each type.
Get context by type:
FlowingContext.Globals.Get<int>();
Represents mutable name-based ambient context properties.
Get context by key:
FlowingContext.Properties.Get<long>("a");
The main prime example is trace. If you use the Context, you can add prefix to operation like at this example: