Copyright © 2011 Marius Bucur
Copyright © 2013 Charles Chance, Sipcentric Ltd.
Copyright © 2015 Olle E. Johansson, Edvina AB
Table of Contents
dmq_load_api(dmq_api_t* api)
register_dmq_peer(dmq_peer_t* peer)
bcast_message(dmq_peer_t* peer, str* body, dmq_node_t* except,
dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
send_message(dmq_peer_t* peer, str* body, dmq_node_t* node,
dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
List of Examples
server_address
parameternotification_address
parametermulti_notify
parameternum_workers
parameterping_interval
parameterdmq_handle_message
usagedmq_send_message
usagedmq_bcast_message
usagedmq_t_replicate
usagedmq_is_from_node
usagedmq_api_t
structureregister_dmq_peer
usagebcast_message
usagesend_message
usageTable of Contents
The DMQ module implements a distributed message queue on top of Kamailio in order to enable the passing/replication of data between multiple instances. The DMQ "nodes" within the system are grouped in a logical entity called the DMQ "bus" and are able to communicate with each other by sending/receiving messages (either by broadcast or directly to a specific node). The system transparently deals with node discovery, consistency, retransmissions, etc.
Other entities ("peers") are then able to utlize the DMQ bus to pass messages between themselves. Peers are grouped by name in order to ensure the correct messages are passed to the relevant peers. This grouping of peers can be compared to a topic in a typical pub/sub system.
DMQ sends SIP requests using the KDMQ request method, that is private to Kamailio.
Example 1.1. Example of a KDMQ message
This message is for basic DMQ bus handling. Other messages are produced by other modules, like the htable module.
KDMQ sip:notification_peer@192.168.40.15:5090 SIP/2.0 Via: SIP/2.0/UDP 192.168.40.15;branch=z9hG4bK55e5.423d95110000 To: <sip:notification_peer@192.168.40.15:5090> From: <sip:notification_peer@192.168.40.15:5060>;tag=2cdb7a33a7f21abb98fd3a44968e3ffd-5b01 CSeq: 10 KDMQ Call-ID: 1fe138e07b5d0a7a-50419@192.168.40.15 Content-Length: 116 User-Agent: kamailio (4.3.0 (x86_64/linneaus)) Max-Forwards: 1 Content-Type: text/plain sip:192.168.40.16:5060;status=active sip:192.168.40.15:5060;status=disabled sip:192.168.40.17:5060;status=active
The local server address. This is the interface over which the DMQ engine will send/receive messages.
Default value is “NULL”.
Example 1.2. Set server_address
parameter
... modparam("dmq", "server_address", "sip:10.0.0.20:5060") ...
The address of another DMQ node from which the local node should retrieve initial information about all other nodes.
Default value is “NULL”.
Example 1.3. Set notification_address
parameter
... modparam("dmq", "notification_address", "sip:10.0.0.21:5060") ...
Enables the ability to resolve multiple IPv4/IPv6 addresses for a single notification address.
A value of zero resolves to the first IP address found. A non-zero value resolves to all IP addresses associated with the host. This includes addresses from DNS SRV records, A and AAAA records.
Default value is “0”.
The number of worker threads for sending/receiving messages.
Default value is “2”.
Handles a DMQ message by passing it to the appropriate local peer (module). The peer is identified by the user part of the To header.
This function can be used from REQUEST_ROUTE.
Sends a DMQ message directly from config file to a single node.
Meaning of parameters:
peer - name of peer that should handle the message.
node - the node to which the message should be sent.
body - the message body.
content_type - the MIME type of the message body.
This function can be used from any route.
Example 1.8. dmq_send_message
usage
... dmq_send_message("peer_name", "sip:10.0.0.21:5060", "Message body...", "text/plain"); ...
Broadcasts a DMQ message from config file to all active nodes (except self).
Meaning of parameters:
peer - name of peer that should handle the message.
body - the message body.
content_type - the MIME type of the message body.
This function can be used from any route.
Example 1.9. dmq_bcast_message
usage
... dmq_bcast_message("peer_name", "Message body...", "text/plain"); ...
Replicates the current SIP message to all active nodes (except self). Useful for replicating REGISTER, PUBLISH etc. in a clustered environment.
Meaning of parameters:
skip_loop_test - by default, DMQ checks the source IP of the message prior to replication, to ensure it has not been sent by another DMQ node (to avoid infinite loops). If this optional parameter is set to "1", the loop test is not performed. This makes sense, from a performance perspective, if you have already performed the necessary checks in the config script (see dmq_is_from_node()).
This function can be used from REQUEST_ROUTE only.
Checks whether the current message has been sent by another DMQ node in the cluster.
This function can be used from REQUEST_ROUTE only.
Example 1.11. dmq_is_from_node
usage
... # Example REGISTER block if (dmq_is_from_node()) { # Already authenticated, just save contact... } else { # Authenticate, save contact etc. # Assuming all successful... dmq_t_replicate("1"); # Already checked source, don't perform loop test again } ...
Table of Contents
dmq_load_api(dmq_api_t* api)
register_dmq_peer(dmq_peer_t* peer)
bcast_message(dmq_peer_t* peer, str* body, dmq_node_t* except,
dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
send_message(dmq_peer_t* peer, str* body, dmq_node_t* node,
dmq_resp_cback_t* resp_cback, int max_forwards, str* content_type)
The module provides the following functions that can be used in other Kamailio modules.
This function binds the DMQ module and fills the structure with the exported functions below.
Example 2.1. dmq_api_t
structure
... typedef struct dmq_api { register_dmq_peer_t register_dmq_peer; bcast_message_t bcast_message; send_message_t send_message; } dmq_api_t; ...
Registers an entity as a DMQ peer which permits receiving/sending messages between nodes which support the same peer.
Broadcast a DMQ message to all nodes in the DMQ bus excluding self, inactive nodes and "except" if specified.