#message-queue #mqtt #amqp

general-mq

General purposed interfaces for message queues

51 releases

0.1.15 Sep 27, 2024
0.1.12 Aug 31, 2024
0.1.6 Jul 30, 2024
0.0.36 Feb 16, 2024
0.0.6 Mar 31, 2023

#435 in Network programming

Download history 159/week @ 2024-07-22 543/week @ 2024-07-29 101/week @ 2024-08-05 190/week @ 2024-08-12 19/week @ 2024-08-19 316/week @ 2024-08-26 25/week @ 2024-09-02 150/week @ 2024-09-09 247/week @ 2024-09-16 280/week @ 2024-09-23 52/week @ 2024-09-30 10/week @ 2024-10-07 14/week @ 2024-10-14 7/week @ 2024-10-21

96 downloads per month
Used in 4 crates

MIT license

74KB
1.5K SLoC

crates.io Documentation CI Coverage License

general-mq

General purposed interfaces for message queues. Now we provide the following implementations:

  • AMQP 0-9-1
  • MQTT

By using these classes, you can configure queues with the following properties:

  • Unicast or broadcast.
  • Reliable or best-effort.

Notes

  • MQTT uses shared queues to implement unicast.
  • AMQP uses confirm channels to implement reliable publish, and MQTT uses QoS 1 to implement reliable publish/subscribe.

Relationships of Connections and Queues

The term connection describes a TCP/TLS connection to the message broker. The term queue describes a message queue or a topic within a connection. You can use one connection to manage multiple queues, or one connection to manage one queue.

A queue can only be a receiver or a sender at a time.

Connections for sender/receiver queues with the same name

The sender and the receiver are usually different programs, there are two connections to hold two queues.

For the special case that a program acts both the sender and the receiver using the same queue:

  • The AMQP implementation uses one Channel for one queue, so the program can manages all queues with one connection.
  • The MQTT implementation MUST uses one connection for one queue, or both sender and receiver will receive packets.

Test

Please prepare a RabbitMQ broker and a EMQX broker at localhost for testing.

  • To install using Docker:

    $ docker run --rm --name rabbitmq -d -p 5672:5672 rabbitmq:management-alpine
    $ docker run --rm --name emqx -d -p 1883:1883 emqx/emqx
    

Then run the test:

$ cargo test --test integration_test -- --nocapture

Example

Launch RabbitMQ and then run AMQP example:

$ cargo run --example simple

Launch EMQX and then run MQTT example:

$ RUN_MQTT= cargo run --example simple

Dependencies

~22–35MB
~652K SLoC