#message-queue #mqtt #amqp #mq

general-mq

General purposed interfaces for message queues

35 releases

0.0.36 Feb 16, 2024
0.0.35 Dec 15, 2023
0.0.34 Oct 20, 2023
0.0.20 Jul 28, 2023
0.0.6 Mar 31, 2023

#750 in Network programming

Download history 78/week @ 2024-02-10 49/week @ 2024-02-17 34/week @ 2024-02-24 7/week @ 2024-03-02 19/week @ 2024-03-09 9/week @ 2024-03-16 1/week @ 2024-03-23 68/week @ 2024-03-30 8/week @ 2024-04-06 3/week @ 2024-04-13

81 downloads per month
Used in 4 crates

MIT license

73KB
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–37MB
~701K SLoC