@mqueue/queue
Version:
A simple queue interface with support for multiple backends
192 lines (157 loc) • 6.68 kB
Markdown
# mqueue (Multi-Queue)
Simple queue interface with support for multiple backends. Keep your options
open.
## Installation
Install MQueue and select adapters:
```bash
# Install MQueue:
npm install --save /queue # + Adapter(s)...
# or use pnpm/yarn
# Install some adapters
npm install --save /amqplib
npm install --save /azure-service-bus
npm install --save /google-cloud-pubsub
npm install --save /rhea
npm install --save /sqs
npm install --save /mqtt
npm install --save /kafkajs
npm install --save /stompjs
npm install --save /fastq
```
```ts
import MQueue from "@mqueue/queue"; // or require("@mqueue/queue");
const outgoingQueue = new MQueue.Outgoing(
await AmqplibOutgoingQueue.connect("amqp://rabbitmq:5271", "queue-name"),
);
// Send a message to the queue
outgoingQueue.sendMessage({
headers: {
"Account-ID": "123",
},
body: "...",
});
// ...
const incomingQueue = new MQueue.Incoming(
await AmqplibIncomingQueue.connect("amqp://rabbitmq:5271", "queue-name"),
);
// Start listening to the queue
await incomingQueue.consume(async (payload) => {
const topicOrQueueName = payload.transport.name;
const headers = payload.message.headers;
const data = await payload.message.json();
await payload.accept(); // or await payload.reject();
// ...
});
```
## Queue Adapters
- [`/amqplib`][]: AMQP v0.9.1 queue adapter
- [`/sqs`][]: AWS Simple Queue Service (SQS) queue adapter
- [`/rhea`][]: AMQP v1.0 queue adapter
- [`/azure-service-bus`][]: Azure Service Bus queue adapter
- [`/google-cloud-pubsub`][]; Google Cloud Pub/Sub adapter
- [`/mqtt`][]: MQTT Queue Adapter
- [`/kafkajs`][]: Kafka Queue Adapter
- [`/stompjs`][]: STOMP Queue Adapter
- [`/fastq`][]: Fastq In-Memory Queue Adapter
## Broadcast Strategies
- [`/multicast`][]: Multi-queue simultaneous publishing/consumption
strategy
## Compatibility
[Why might you need a Message Queue?](https://blog.bytebytego.com/p/why-do-we-need-a-message-queue)
- **NodeJS** v18+, tested on v22+
| Queue Platform | Queue Adapter |
| --------------------------------------------- | --------------------------------- |
| Apache ActiveMQ (AMQP v1.0) | [`/rhea`][] |
| Apache ActiveMQ (MQTT) | [`/mqtt`][] |
| Apache ActiveMQ (STOMP) | [`/stompjs`][] |
| Apache Kafka | [`/kafkajs`][] |
| AWS Simple Queue Service (SQS) | [`/sqs`][] |
| Azure Service Bus | [`/azure-service-bus`][] |
| Azure Service Bus (AMQP v1.0) [^1] | [`/rhea`][] |
| Eclipe Mosquitto | [`/mqtt`][] |
| ElasticMQ (SQS-Compatible) | [`/sqs`][] |
| EMQX (MQTT) | [`/mqtt`][] |
| Fastq | [`/fastq`][] |
| Google Cloud Pub/Sub | [`/google-cloud-pubsub`][] |
| HiveMQ (MQTT) | [`/mqtt`][] |
| RabbitMQ (AMQP v0.9.1) | [`/amqplib`][] |
| RabbitMQ (AMQP v1.0 or with AMQP v1.0 Plugin) | [`/rhea`][] |
| RabbitMQ (with MQTT Plugin) | [`/mqtt`][] |
| RabbitMQ (with STOMP Plugin) | [`/stompjs`][] |
| IBM MQ (AMQP v1.0) | [`/rhea`][] |
## Examples
```ts
// Example: Switching between AMQP v0.9.1 and SQS for development and production
const isProduction = process.env.NODE_ENV === "production";
const outgoingQueue = new MQueue.Outgoing(
isProduction
? await SQSOutgoingQueue.connect("/queue1", {
credentials: { accessKeyId: "x", secretAccessKey: "x" },
region: "elasticmq", // or applicable AWS region for SQS
endpoint: "http://elasticmq:9324",
})
: await AmqplibOutgoingQueue.connect("amqp://rabbitmq:5271", "queue-name"),
);
outgoingQueue.sendMessage({
headers: {
"Account-ID": "123",
},
body: "...",
});
// ...
const incomingQueue = new MQueue.Incoming(
isProduction
? await SQSIncomingQueue.connect("/queue1", {
credentials: { accessKeyId: "x", secretAccessKey: "x" },
region: "elasticmq", // or applicable AWS region for SQS
endpoint: "http://elasticmq:9324",
})
: await AmqplibIncomingQueue.connect("amqp://rabbitmq:5271", "queue-name"),
);
```
```ts
// Adding digital signature verification
import { SignatureHashHook } from "@mqueue/queue";
const outgoingQueue = new MQueue.Outgoing(
await AmqplibOutgoingQueue.connect("amqp://rabbitmq:5271", "queue-name"),
{ onSend: [SignatureHashHook.outgoing()] },
);
outgoingQueue.sendMessage({
headers: {
"Account-ID": "123",
},
body: "...",
});
// ...
const incomingQueue = new MQueue.Incoming(
await AmqplibIncomingQueue.connect("amqp://rabbitmq:5271", "queue-name"),
{ onReceipt: [SignatureHashHook.incoming()] },
);
```
## License
[MIT © Dom Webber](./LICENSE)
[^1]:
Better authentication integration may be achieved with Azure Service bus by
using [`/azure-service-bus`][] instead of [`/rhea`][].
[`/queue`]:
https://github.com/domwebber/mqueue/blob/main/packages/queue/README.md
[`/amqplib`]:
https://github.com/domwebber/mqueue/blob/main/packages/amqplib/README.md
[`/sqs`]:
https://github.com/domwebber/mqueue/blob/main/packages/sqs/README.md
[`/rhea`]:
https://github.com/domwebber/mqueue/blob/main/packages/rhea/README.md
[`/azure-service-bus`]:
https://github.com/domwebber/mqueue/blob/main/packages/azure-service-bus/README.md
[`/mqtt`]:
https://github.com/domwebber/mqueue/blob/main/packages/mqtt/README.md
[`/kafkajs`]:
https://github.com/domwebber/mqueue/blob/main/packages/kafkajs/README.md
[`/stompjs`]:
https://github.com/domwebber/mqueue/blob/main/packages/stompjs/README.md
[`/fastq`]:
https://github.com/domwebber/mqueue/blob/main/packages/fastq/README.md
[`/google-cloud-pubsub`]:
https://github.com/domwebber/mqueue/blob/main/packages/google-cloud-pubsub/README.md
[`/multicast`]:
https://github.com/domwebber/mqueue/blob/main/packages/multicast/README.md