=Event system= We are using rabbitmq to publish/subscribe the events happenned in the system. For every kind of event, there are two defined methods . # on change event: the event information is published whenever the state is changed for the system. # on request sync: the complete event information is published whenever system is receiving sync commands. Notice: in order to simplify the design, the event information published by on_change_event or on_request_sync are using the same object format except there is a flag(is_sync) to distinguish them. And also, they are sending though the same exchange. == online/offline == * Event exchange type: '''topic''' * Event exchange name: '''voice_events''' * Event routing key: '''terminal.online_offline_states''' * sync listening exchange type: '''fanout''' * sync listening exchange name: '''voice_sync_online''' * sync routing key: empty * sync msg: '''sync_terminal_states''' ===sample=== * format: yaml * sample:
--- is_sync: false online: - f4908713 - '00000030' - 00000018 - 00000089 - 00000038 - 00000028 - '00000020' - 00000078 - '00000004' - f5084724 - '00000006' - f8603151 - '00000024' - '00000022' - f7475634 - a1cc94a6 - f5601645 - '00000007' - '00000075' online_dialno: - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '' - '1003' - '' - '' - '' offline: [] offline_dialno: []
--- is_sync: true online: - f4908713 - '00000030' - 00000018 - 00000089 - 00000038 - 00000028 - '00000020' - 00000078 - '00000004' - f5084724 - '00000006' - f8603151 - '00000024' - '00000022' - f7475634 - a1cc94a6 - f5601645 - '00000007' - '00000075' - '00000014' - 00000019 - f2494470 - '00000034' - 00000086 - '00000005' - '00000015' - '00000003' - 00000087 - '00000032' - f0431540 offline: []===explain=== * online section: defines all the terminals which are currently online. * online_dialno section: one to one map to online section, which defines the dialno for each sn. '''Notice:'''Only valid in not sync state. * offline section: defines all the terminals which are currently offline. * offline_dialno section: one to one map to offline section, which defines the dialno for each sn. '''Notice:'''Only valid in not sync state. Notice: # In non-sync mode, online/offline defines which terminal's states are changed. # In sync mode, online list defines all terminals which are on line. And if terminal is not in the online list, it is assumed to be offline. == Channel states == * Event exchange type: '''topic''' * Event exchange name: '''voice_events''' * Event routing key: '''channel.call_state''' * sync listening exchange type: '''fanout''' * sync exchange name: '''voice_sync_events''' * sync routing key: empty * sync msg: '''channel.call_state''' * terminal startup msg: '''terminal.voice_crash''' it will do full sync including clean current active sessions ** terminal startup msg arguments: [dialno] * terminal reboot msg: '''terminal.reboot''' the machine is reboot or startup from power without active calls ** terminal reboot msg argumetns: [dialno] * terminal reboot msg: '''terminal.reboot_calls''' the machine is reboot or startup from power with active calls * cluster states sync msg: ** '''cluster.master''': we become master ** '''cluster.backup''': we become backup server ===sample=== * format: yaml * sample:
--- !ruby/object:Channel_states
is_sync: false
evts:
- uuid: 65da6180-877b-4378-a0bc-161f969fe643
s_id: 599067108406308
t_id: 0008
c_type: broadcast
is_caller: ''
j_name: broadcast
t_type: gui
t_src: client
r_uuid: ''
from: '0008'
to: ''
des: '*#BROADCAST#_#SPE#_6c851bb_?#*#b_n=6c851bb;d_ds=1004:1003:1002 '
state: EARLY
is_loopback: false
- uuid: 65da6180-877b-4378-a0bc-161f969fe643
s_id: 599067108406308
t_id: 0008
c_type: broadcast
is_caller: ''
j_name: broadcast
t_type: gui
t_src: client
r_uuid: ''
from: '0008'
to: ''
des: '*#BROADCAST#_#SPE#_6c851bb_?#*#b_n=6c851bb;d_ds=1004:1003:1002 '
state: RINGING
is_loopback: false
- uuid: 65da6180-877b-4378-a0bc-161f969fe643
s_id: 599067108406308
t_id: 0008
c_type: broadcast
is_caller: ''
j_name: broadcast
t_type: gui
t_src: client
r_uuid: ''
from: '0008'
to: ''
des: '*#BROADCAST#_#SPE#_6c851bb_?#*#b_n=6c851bb;d_ds=1004:1003:1002 '
state: EARLY
is_loopback: false
- uuid: 65da6180-877b-4378-a0bc-161f969fe643
s_id: 599067108406308
t_id: 0008
c_type: broadcast
is_caller: true
j_name: broadcast
t_type: gui
t_src: client
r_uuid: ''
from: '0008'
to: ''
des: '*#BROADCAST#_#SPE#_6c851bb_?#*#b_n=6c851bb;d_ds=1004:1003:1002 '
state: ACTIVE
is_loopback: false
===explain===
For each call, it consists a list of channels. Each channel can be imaged as a connection to a terminal. Notice: we are using loopback channel as well, which is hacking way to handle some conditions in the system. Normally, we could ignore them.--- is_sync: false terminals: - !ruby/object:Terminal::TerminalDialno t_sn: '00000001' dialno: '1006'
--- is_sync: true terminals: - !ruby/object:TerminalDialno t_sn: f8611510 dialno: '1000' - !ruby/object:TerminalDialno t_sn: f6482105 dialno: '1005' - !ruby/object:TerminalDialno t_sn: f5944661 dialno: '1002' - !ruby/object:TerminalDialno t_sn: f8613240 dialno: '1001' - !ruby/object:TerminalDialno t_sn: 8d1cfb56 dialno: '1004' - !ruby/object:TerminalDialno t_sn: '00000001' dialno: '1006' - !ruby/object:TerminalDialno t_sn: a1cc94a6 dialno: '1003'