My first though on reading about Domains was also "yay, I can access 
request-specific state (for logging, bail-out on abort, etc.) without 
having to pass request objects through every single function in the 
codebase (including libraries unrelated to http servers)".

There's definitely a desire to be able to do that, and if there's a feature 
that lets you do it, people are going to start using it.

James

On Tuesday, 10 July 2012 23:17:20 UTC+1, Elad Ben-Israel wrote:
>
> Not sure exactly what use case Gaurav is interested in, but I was 
> interested in this thread because I think there is an unmet need around 
> logging which domain-attached context could help solve (even a single 
> pointer to a global instance). Logs are emitted everywhere across 
> application (and library) stack and in node, mostly via `console.xxx`. One 
> useful feature would be to allow, for example, correlating all console logs 
> emitted during the processing of an incoming request. A few logging 
> libraries do allow pushing context but they all require passing along some 
> state throughout the async hoops, which means modifying the way logging is 
> done throughout the entire stack.
>
> I found the ability to push implicit context to logs pretty useful in 
> debugging large and chatty systems, and it is used in many environments. In 
> yakky synchronous multi threaded environments, it's easy to implement 
> nowadays using thread local storage. In the async environment of node I am 
> wondering if it requires some additional support.
>
> I think proper support from node to this need would be valuable. Domains 
> seemed like a natural approach to me, given their basic attribute is 
> passing along implicit context across asynchronous call chains, and I ran 
> into `process.domain` following this thread of thought.
>
> Cheers,
> Elad.
>
> On Wed, Jul 11, 2012 at 12:51 AM, Isaac Schlueter <i...@izs.me> wrote:
>
>> Consider this the opposite of a blessing.
>>
>> That is not only an undocumented feature, but an undocumented
>> implementation detail of an experimental feature.  You can pretty well
>> be assured it will change in a future release.  (Though, not in
>> v0.8.x, which is API and ABI frozen.)  The reason that it's not
>> documented is because it's sort of a kludgey way to keep track of the
>> current domain, and we want to leave the option open for more elegant
>> or performant approaches in the future.
>>
>> If you want per-request storage, what's wrong with putting stuff on
>> the request object like everyone else does?
>>
>> Sorry if I'm missing the point of your question here.  "Thread-local"
>> only really makes sense in servers that spawn a new thread (or
>> thread-like thing) for each request.  Node doesn't do that.  It's
>> relevant in those environments because threads can preempt one
>> another, so you have to be careful to use thread-safe data structures
>> or else you'll have problems.  Node's JavaScript is single-threaded,
>> and cannot be preempted, so you never have that issue.  And child
>> processes don't share memory (mostly) so you don't have corruption
>> issues.
>>
>> So, (a) the thing you're talking about doesn't really exist, because
>> (b) you probably don't actually need it.  You've got global (which is
>> per-process), module-local (the var's you define in your module),
>> exports (specific to a module, but visible from the outside), and
>> several objects relating to different conceptual constructs (like the
>> req, the req.socket, the response, child processes, etc.)  Your
>> program isn't ever preempted, so "thread local" is not relevant here.
>>
>>
>>
>> On Tue, Jul 10, 2012 at 11:53 AM, Elad Ben-Israel
>> <elad.benisr...@gmail.com> wrote:
>> > Done a little bit of digging and found out the undocumented
>> > `process.domain`, which actually allows one to access the current domain
>> > from anywhere. This is very similar to "thread local storage", but it's 
>> way
>> > awesomer because it automatically traverses async calls.
>> >
>> > For example (node 0.8.2):
>> >
>> > ```
>> > var domain = require('domain');
>> > var http = require('http');
>> >
>> > function do_some_async_stuff(callback) {
>> >   setTimeout(function() {
>> >     console.log('url of current request is', process.domain &&
>> > process.domain.url);
>> >     return callback();
>> >   }, 500);
>> > }
>> >
>> > var server = http.createServer(function(req, res) {
>> >   var d = domain.create();
>> >
>> >   // attach `req.url` to the domain as arbitrary context
>> >   d.url = req.url;
>> >
>> >   d.run(function() {
>> >     do_some_async_stuff(function(err) {
>> >       res.end('done');
>> >     });
>> >   });
>> > });
>> >
>> > server.listen(5000);
>> > ```
>> >
>> > This is an undocumented feature so I would advise not to use it before
>> > someone from node core gives their blessing.
>> >
>> > Any thoughts from the core maintainers on this? Why did you guys choose 
>> not
>> > to document it? Any caveats that people should be aware of?
>> >
>> > Cheers,
>> > Elad.
>> >
>> > On Wed, Jul 4, 2012 at 7:03 AM, Gaurav Vaish <gaurav.va...@gmail.com> 
>> wrote:
>> >>
>> >> Hi Elad,
>> >>
>> >> > As far as I know node does not support something like that. One idea
>> >> > that
>> >> > came to mind is to add support for associating arbitrary context to a
>> >> > domain<http://nodejs.org/docs/latest/api/all.html#all_domain> and
>> >> > extract it along the way.
>> >> >
>> >> > I was thinking on trying to hack something like that. Any thoughts?
>> >>
>> >> Do you already have some thoughts on the same?
>> >>
>> >>
>> >> --
>> >> Happy Hacking,
>> >> Gaurav Vaish
>> >> www.m10v.com
>> >>
>> >
>> >
>> >
>> > --
>> > Elad.
>>
>
>
>
> -- 
> Elad.
>  

Reply via email to