> Every nodeX will have the same "notification" process, which is listening to dbX/_changes. sorry with "same" here, I mean same type of process, but obviously one instance of it, running on each node
--Giovanni 2015-11-13 13:00 GMT+01:00 Giovanni Lenzi <g.le...@smileupps.com>: > not sure I understood correctly.. what you mean is: > > I create 3 nodes: > node1 with single database named db1 > node2 with single database named db2 > node3 with single database named db3 > > Then I create 3 continuous replication: db1 <-> db2, db1<-> db3, db2 <->db3 > > Every nodeX will have the same "notification" process, which is listening > to dbX/_changes. > > What you mean is then: "I use db_name as filter instead of node_name, > given that every nodeX will have one and only one single database dbX". > Right? > > > > --Giovanni > > 2015-11-13 11:44 GMT+01:00 Alexander Shorin <kxe...@gmail.com>: > >> On Fri, Nov 13, 2015 at 1:28 PM, Giovanni Lenzi <g.le...@smileupps.com> >> wrote: >> >> No, slow is gathering all the stats. Especially in cluster. The >> >> db_name you can get from req.userCtx without problem. >> >> >> > >> > Does req.userCtx contain also db_name currently? I thought it was only >> for >> > user data (username and roles). Are you saying that it would be >> possible >> > to gather db_name only or you are forced to fetch the entire set only? >> > >> >> not db_name exactly, but: >> >> "userCtx": { >> "db": "mailbox", >> "name": "Mike", >> "roles": [ >> "user" >> ] >> } >> >> >> >> > Also I was wondering how heavy could be to include some kind of >> machine >> >> > identifier(hostname or ip address of machine running couchdb) inside >> of >> >> the >> >> > request object? >> >> >> >> What is use case for this? Technically, req.headers['Host'] points on >> >> the requested CouchDB. >> >> >> >> > Or if you want to make it even more flexible: how heavy could be to >> >> include >> >> > a configuration parameter inside of the request object? >> >> > >> >> > That could be of great help in some N-nodes master-master redunded >> >> database >> >> > configurations, to let one node only(the write node) handle some >> specific >> >> > background action. >> >> >> >> Can you describe this problem a little bit more? How this >> >> configuration parameter could be used and what it will be? >> >> >> >> >> > Ok let's think to a 2-node setup with master-master replication set up >> and >> > a round-robin load-balancer in front of them. In normal condition, with >> > master-master replication you can balance both read and write requests >> to >> > every node, right? >> > >> > Now, let's think we need backend services too(email, sms, payments) by >> > using some plugin or node.js process(like triggerjob). These react to >> > database _changes, execute some background task and then update the same >> > document with a COMPLETED state. The drawback is that, in N-node >> > configuration, every node is going to execute same background tasks(2 or >> > N-emails will be sent instead of 1, 2 payment transaction instead of 1 >> and >> > so on). >> > >> > Ok, you may say, with haproxy you can balance only reads(GET,HEAD) and >> use >> > one node only for writes. But what if the write-node goes down? I won't >> > have the chance to write anymore, only read. >> > >> > BUT we can probably do better.. let's step back to balance both read and >> > writes. If we have a way to specify, in the update function itself, >> which >> > node is in charge of executing those tasks, they could then be executed >> > only once! A trivial, but efficient solution which comes to my mind is: >> let >> > the backend task be handled by the node who received the write request. >> If >> > the update function knows some kind of machine identifier (or >> configuration >> > parameter previously setup), it could mark the task in the document >> itself >> > with the name of the machine responsible for its execution. The plugin >> or >> > node-js process may then execute only tasks allocated to him, by simply >> > using a filtered _changes request with his own node name. >> > >> > This solution has the benefit of letting system administrators to have >> > identical N nodes (same data, same ddocs and configuration, only node >> name >> > differs) which balance both read, write requests and backend task >> > processing. In this way you may then scale out by simply spawning a new >> > node with the same amazon AMI as example. >> > >> > Am I missing something? >> >> That's what 2.0 is going to solve (: >> >> For 1.x I would use the following configuation: >> >> db1 --- /_changes --\ >> db2 --- /_changes ---> notification-process -> notification-db >> dbN --- /_changes --/ >> >> In notification db you store all the tasks that are need to be done >> and are already done. Since your db1, db2, dbN are in sync, their >> changes feed will eventually produce similar events which you'll have >> to filter by using your notification-db data. >> >> -- >> ,,,^..^,,, >> > >