# Architecture overview

BullMQ Proxy is implemented using a relative simple architecture, yet it provides a lot of flexibility.

At the core of the proxy we have the [Bun javascript runtime](https://bun.sh/). The choice of this runtime is mostly due to its much better HTTP and WebSocket performance and memory consumption than what is available on other popular runtimes such as NodeJS.&#x20;

The proxy encapsulates BullMQ library (powered by a Redis™, or compatible instance), and provides an HTTP Restful API (and a WebSocket's API soon), that allows any language or framework that supports HTTP clients and servers to interact with the queues as well as to process jobs.

For example, adding a bunch of jobs to a queue implies posting an array with jobs to `/queues/:queue-name/jobs`, whereas to process the jobs we need to register an http endpoint (also known as a webhook) that will be called every time there is a job to process. This effectively allows BullMQ to be used on a multi-language multi-framework platform, unlocking easy communication and job management between any services.

{% @mermaid/diagram content="graph LR
AddJob\[Add Job] -->|HTTP POST /jobs| BullMQProxy\[BullMQ Proxy]
BullMQProxy -->|uses| Redis\[(Redis Database)]
BullMQProxy -->|HTTP POST /process| Worker1\[Worker 1]
BullMQProxy -->|HTTP POST /process| Worker2\[Worker 2]
BullMQProxy -->|HTTP POST /process| WorkerN\[Worker N]
Worker1 -->|HTTP 200 OK| BullMQProxy
Worker2 -->|HTTP 200 OK| BullMQProxy
WorkerN -->|HTTP 200 OK| BullMQProxy

```
classDef database fill:#f96,stroke:#333,stroke-width:2px;
class Redis database;" %}
```
