multiple domain example¶
objective¶
Explore:
queue
enqueue
dequeue
forward-service
forward-queue
The abillity of casual to discover resources in remote domains.
We’ll set up two domains, A and B.
From within A we’ll enqueue a message to a queue in B.
In B, a queue-service forward will dequeue the message and call a service in A and the reply is enqueued in another queue in B.
in B, a queue-queue forward will dequeue the reply and enqueue it at a queue in A. A queue service forward dequeues the message and calls a service that will abort the transaction, hence the message is moved to the corresponding error queue.
diagram¶
A simplified sequence diagram on what’s going on (discovery and transaction related activity is omitted)
prerequisites¶
See domain example
create domains¶
Create a directory where you want your domains to “live”.
In production you probably want to have a dedicated user for each domain and just use the “domain-user” home directory as the domain root
The following will be used in this example.
$ mkdir -p $HOME/casual/example/domain/multiple
Copy the domains setup from the example:
$ cp -r $CASUAL_HOME/documentation/example/domain/multiple/* $HOME/casual/example/domain/multiple/
configuration¶
Each domain has it’s configuration in $CASUAL_DOMAIN_HOME/configuration/domain.yaml. In our example these will be located at:
$HOME/casual/example/domain/multiple/A/configuration/domain.yaml$HOME/casual/example/domain/multiple/B/configuration/domain.yaml
The environment variable CASUAL_DOMAIN_HOME is the only thing that dictates which domain you’re using and working with
If you chose another base directore for this example, please update the following files so they corresponds with your choice
start A¶
In the terminal for A.
prepare¶
Make sure the required environment settings are sourced.
You only have to do this once.
A$ cd $HOME/casual/example/domain/multiple/A
A$ source domain.env
boot¶
We provide our configuration for the domain:
A$ casual domain --boot configuration/domain.yaml
start B¶
In the terminal for B.
prepare¶
B$ cd $HOME/casual/example/domain/multiple/B
B$ source domain.env
boot¶
We provide our configuration for the domain:
B$ casual domain --boot configuration/domain.yaml
interact with the setup¶
current state¶
View current state in the two domains.
domain A¶
List connections:
A$ casual gateway --list-connections 
name  id                                group     bound  local            peer             created                         
----  --------------------------------  --------  -----  ---------------  ---------------  --------------------------------
B     c92c58fbcf7242139446e1618a2eec0f  outbound  out    127.0.0.1:61973  127.0.0.1:7772   2021-10-23T13:16:54.286028+02:00
B     c92c58fbcf7242139446e1618a2eec0f  inbound   in     127.0.0.1:7771   127.0.0.1:61972  2021-10-23T13:16:52.289561+02:00
We have one inbound and one outbound connection to B.
List services:
A$ casual service --list-services 
name                                   category  mode  timeout   contract  I  C  AT        min       max       P  PAT       RI  RC  last
-------------------------------------  --------  ----  --------  --------  -  -  --------  --------  --------  -  --------  --  --  ----
casual/example/advertised/echo         example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/conversation            example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/domain/echo/A           example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/domain/name             example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/echo                    example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/error/system            example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/forward                 example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/forward/echo            example   auto  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/forward/join/echo       example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/lowercase               example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/rollback                example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/sink                    example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/sleep                   example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/terminate               example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/uppercase               example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/work                    example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -   
casual/example/echo and casual/example/rollback is advertised from one local instance, and no one has requested the services yet.
List queue information:
A$ casual queue --list-queues 
name      group  rc  rd        count  size  avg  EQ  DQ  UC  last
--------  -----  --  --------  -----  ----  ---  --  --  --  ----
a1        A       0  0.000000      0     0    0   0   0   0  -   
a2        A       0  0.000000      0     0    0   0   0   0  -   
a1.error  A       0  0.000000      0     0    0   0   0   0  -   
a2.error  A       0  0.000000      0     0    0   0   0   0  -   
$ casual queue --list-forward-services 
alias  group      source  target                   reply  delay  CI  I  commits  rollbacks  last
-----  ---------  ------  -----------------------  -----  -----  --  -  -------  ---------  ----
a1     forward-A  a1      casual/example/rollback  -          -  1   1        0          0  -   
domain B¶
List connections:
B$ casual gateway --list-connections 
name  id                                group     bound  local            peer             created                         
----  --------------------------------  --------  -----  ---------------  ---------------  --------------------------------
A     1beb85a07678410aa39de492db9f292f  outbound  out    127.0.0.1:61972  127.0.0.1:7771   2021-10-23T13:16:52.289521+02:00
A     1beb85a07678410aa39de492db9f292f  inbound   in     127.0.0.1:7772   127.0.0.1:61973  2021-10-23T13:16:54.285984+02:00
We have one inbound and one outbound connection to A.
List services:
B$ casual service --list-services 
name  category  mode  timeout  contract  I  C  AT  min  max  P  PAT  RI  RC  last
----  --------  ----  -------  --------  -  -  --  ---  ---  -  ---  --  --  ----
casual/example/echo is not yet known in this domain.
List queue information:
B$ casual queue --list-queues 
name      group  rc  rd        count  size  avg  EQ  DQ  UC  last
--------  -----  --  --------  -----  ----  ---  --  --  --  ----
b1        B       0  0.000000      0     0    0   0   0   0  -   
b2        B       0  0.000000      0     0    0   0   0   0  -   
b3        B       0  0.000000      0     0    0   0   0   0  -   
b1.error  B       0  0.000000      0     0    0   0   0   0  -   
b2.error  B       0  0.000000      0     0    0   0   0   0  -   
b3.error  B       0  0.000000      0     0    0   0   0   0  -    
$ casual queue --list-forward-services 
alias  group      source  target               reply  delay     CI  I  commits  rollbacks  last
-----  ---------  ------  -------------------  -----  --------  --  -  -------  ---------  ----
b1     forward-B  b1      casual/example/echo  b2     0.000000  1   1        0          0  -   
$ casual queue --list-forward-queues   
alias  group      source  target  delay     CI  I  commits  rollbacks  last
-----  ---------  ------  ------  --------  --  -  -------  ---------  ----
b2     forward-B  b2      a1      0.000000  0   0        0          0  -   
enqueue a message¶
In A, enqueue some characters to b1 that is located in B
A$ echo "test" | casual buffer --compose | casual queue --enqueue b1
bec3b4b3cccd4f3b89faee970518ab7d
The message should be enqueued to a1 and then dequeued and rollbacked, hence end up in a1.error pretty much directly.
A$ casual queue --list-queues 
name      group  rc  rd        count  size  avg  EQ  DQ  UC  last                            
--------  -----  --  --------  -----  ----  ---  --  --  --  --------------------------------
a1        A       0  0.000000      0     0    0   1   1   0  2021-10-24T17:38:48.356025+02:00
a2        A       0  0.000000      0     0    0   0   0   0  -                               
a1.error  A       0  0.000000      1     5    5   1   0   0  2021-10-24T17:38:48.356025+02:00
a2.error  A       0  0.000000      0     0    0   0   0   0  -                      
The service `casual/example/echo` should be requested once (the call from remote `B`).
The service `casual/example/rollback` should be requested once from the forward in this domain.
A$ casual service –list-services name category mode timeout contract I C AT min max P PAT RI RC last
casual/example/advertised/echo       example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/conversation          example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/domain/echo/A         example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/domain/name           example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/echo                  example   join  0.000000    linger  1  1  0.000090  0.000090  0.000090  0  0.000000   0   0  2021-10-24T17:38:48.354110+02:00
casual/example/error/system          example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/forward               example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/forward/echo          example   auto  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/forward/join/echo     example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/lowercase             example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/rollback              example   join  0.000000    linger  1  1  0.000033  0.000033  0.000033  0  0.000000   0   0  2021-10-24T17:38:48.357365+02:00
casual/example/sink                  example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/sleep                 example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/terminate             example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/uppercase             example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
casual/example/work                  example   join  0.000000    linger  1  0  0.000000  0.000000  0.000000  0  0.000000   0   0  -
In `B`, `casual/example/echo` should be known with no local instances:
B$ casual service –list-services name category mode timeout contract I C AT min max P PAT RI RC last
casual/example/echo example join 0.000000 linger 0 1 0.000648 0.000648 0.000648 0 0.000000 1 1 2021-10-24T17:38:48.354246+02:00