MqContextC - create and manage a slave context … More...
Collaboration diagram for MqContextC_SlaveApi_RB_API:MqContextC - create and manage a slave context …
The master-slave-link is used to create a mesh of nodes defined by different parent-context. The master control the slave.
The master-slave-link is used to perform the following tasks:
In difference to the client-server-link the master-slave-link connect two independent parent-context in the same process or thread (e.g. node). This leads to the restriction that only the master-context can be a server-context because only one server-context per node is possible.
node-0 | node-1/2 | node-3/4/5
===================================================================
| <- client/server link -> | <- client/server link -> |
| <-- master/slave link --> |
|- client1-0 -|- server3 ...
|- server1 -|
| |- client1-1 -|- server4 ...
client0-0 -|
|- server2 -|- client1-2 -|- server5 ...
Definition of the "master-context"
Definition of the "slave-context"
0.Definition of the "worker-context"
0./etc/services 0 | slave-id | value | definition |
|---|---|---|
| MQ_SLAVE_MAX | 1024 | internal: the maximum slave-id … . |
| MQ_SLAVE_USER | 10 | internal: start of user-defined-slave-id . |
| MQ_SLAVE_LOOPBACK | 0 | internal: the loopback-slave-id, (call my own services) . |
| MQ_SLAVE_FILTER | 1 | internal: the filter-slave-id, (on a master get the filter-slave) . |
| MQ_SLAVE_MASTER | 1 | internal: the master-slave-id, (on a slave get the master) . |
| MQ_SLAVE_OTHER | 1 | internal: on the master-ctx get the slave-ctx and on the slave-ctx get the master-ctx . |
| range | definition |
|---|---|
| 0 <= slave-id < MQ_SLAVE_MAX | range of valid slave-id's |
| 0 <= slave-id < MQ_SLAVE_USER | internale usage |
| MQ_SLAVE_USER <= slave-id < MQ_SLAVE_MAX | external usage |
Definition of the "LOOPBACK" (0) slave
client | server |
===========================================
| <--- client/server ---> | <-- loop --> |
| <------ master/slave -----> |
client -- | -- server -- | -- client -- #
== == #
server -- | -- client -- # slave-id = 0 . MyLoopServer.rb → create a new loop-server require "rbmqmsgque" include MqMsgque # package-item class MyLoopServer < MqContextC attr_reader :mydata # factory startup def initialize() super() ConfigSetServerSetup(method(:ServerSetup)) # set the "mydata" attribute to the master-context @mydata = "Hello World" end # service to serve all EXTERNAL requests for token "HLWO" def HLWO_srv # get the "loopback" context loop = SlaveGet(MqSlaveE::LOOPBACK) # call the LOOP service on the SAME server loop.Send("W","LOOP") # answer HLWO with string-return from LOOP Send("R", "C", loop.ReadSTR()) end # service to serve all INTERNAL requests for token "LOOP" def LOOP_srv(loop) # get the "master" context master = loop.SlaveGetMaster() # answer LOOP with data from MASTER->mydata attribute loop.Send("R", "C", master.mydata) end # define a service as link between the token "HLWO" and the callback "HLWO_srv" def ServerSetup loop = SlaveGet(MqSlaveE::LOOPBACK) # EXTERNAL: link the "HLWO" service with "HLWO_srv" ServiceCreate("HLWO",method(:HLWO_srv)) # INTERNAL: link the "LOOP" service with "LOOP_srv" loop.ServiceCreate("LOOP",method(:LOOP_srv)) end end # ==================================================== # package-main # create the "MyLoopServer" factory… and the instance srv = MqFactoryC.Add(MyLoopServer).New() begin srv.LinkCreate(ARGV) srv.ProcessEvent(MqWaitOnEventE::FOREVER) rescue Exception => ex srv.ErrorCatch(ex) ensure srv.Exit() end
Performance analyse
Nhi1Exec perfclient.c --parent --wrk ? @ perfserver.cNhi1Exec -r=uds perfserver.c --spawn|fork|threadNhi1Exec -r=uds perfclient.c --parent --wrk ? perfclient worker perfserver
========== ====== ==========
|
|- loop --wrk x
|- MqSlaveWorker(...) -> worker[1]
|- MqSend(worker[1],"E","STR0..") -> PerfWorker_I160(...)
|- loop endless
|- MqContextCreate(...)
|- MqLinkCreate(...) <-> MqContextCreate(...)
|- MqContextDelete(...) <-> MqContextDelete(...)
|- sleep x sec
|- loop --wrk x
|- MqSend(worker[1],"C"..,"END0") -> PerfWorker_END0(...)
| |- stop loop
|- "callback" - add number to all <- |- return #context | setup | –wrk | # worker-context | performance | info |
|---|---|---|---|---|
| pipe | 1 | 2500 | 1000 | the pipe start a new worker-context with spawn |
| spawn | 1 | 2500 | <1000 | same as pipe but use network-protocoll |
| fork | 1 | 3800 | 4000 | the fork is faster than spawn |
| thread | 1 | 16500 | 9000 | the thread is faster than fork |
| pipe | 4 | 8000 | 4500 | the worker scale linear up to number of processors |
| spawn | 4 | 7600 | <4500 | - |
| fork | 4 | 23200 | 11500 | - |
| thread | 4 | 55500 | 27500 | - |
| pipe | 8 | 10000 | 5500 | the additional scaling up to the max hyper-threading does not really help |
| spawn | 8 | 9100 | <5500 | - |
| fork | 8 | 23200 | 11500 | - |
| thread | 8 | 55500 | 27500 | - |
|
static |
Ruby: → C-API bool ctx.SlaveCheck(id:MqSlaveE|int32)
check if slave-id is valid
Definition at line 2721 of file MqContextC_rb.c.
|
static |
Ruby: → C-API ctx.SlaveCreate(id:MqSlaveE|int32, slave:MqContextC)
create a master/slave link between the master-parent-context and the slave-parent-context …
Definition at line 2733 of file MqContextC_rb.c.
|
static |
Ruby: → C-API ctx.SlaveDelete(id:MqSlaveE|int32)
Delete a slave object from a master/slave link identified by id. …
Definition at line 2748 of file MqContextC_rb.c.
|
static |
Ruby: → C-API MqContextC ctx.SlaveGet(id:MqSlaveE|int32)
get the slave-context from a master-context …
Definition at line 2679 of file MqContextC_rb.c.
|
static |
Ruby: → C-API MqContextC ctx.SlaveGetFilter()
get the filter-ctx or the master-ctx …
Definition at line 2693 of file MqContextC_rb.c.
|
static |
Ruby: → C-API MqContextC ctx.SlaveGetMaster()
opposite function of MqSlaveGetFilter
Definition at line 2666 of file MqContextC_rb.c.
|
static |
Ruby: → C-API MqContextC ctx.SlaveGetProxy(id:MqSlaveE|int32)
on slave return the master and on master return the slave identified by id.
Definition at line 2705 of file MqContextC_rb.c.
|
static |
Ruby: → C-API bool ctx.SlaveIs()
is the context a slave-context ? …
Definition at line 2761 of file MqContextC_rb.c.
|
static |
Ruby: → C-API ctx.SlaveWorker(id:MqSlaveE|int32, ?fct:string="WORKER"?, ?args:MkBufferListC...=nil?)
create a master/slave link using the image of the ctx object self. …
Definition at line 2771 of file MqContextC_rb.c.