Skip to content

Commit cd9afbf

Browse files
committed
Use orjson as dramatiq encoder
Signed-off-by: Federico Busetti <[email protected]>
1 parent 4f805ff commit cd9afbf

File tree

3 files changed

+104
-3
lines changed

3 files changed

+104
-3
lines changed

poetry.lock

Lines changed: 85 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

pyproject.toml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ opentelemetry-instrumentation-celery = "*"
3434
opentelemetry-instrumentation-httpx = "*"
3535
opentelemetry-instrumentation-sqlalchemy = "*"
3636
opentelemetry-instrumentor-dramatiq = "*"
37+
orjson = "^3.10.12"
3738
pydantic = "^2.2.1"
3839
pydantic-settings = "^2.0.3"
3940
python = ">=3.9,<3.14"

src/common/dramatiq.py

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,27 @@
1-
from dramatiq import set_broker
1+
from dramatiq import set_broker, set_encoder
22
from dramatiq.brokers.stub import StubBroker
33
from dramatiq.brokers.redis import RedisBroker
4+
from dramatiq.encoder import Encoder, DecodeError, MessageData
45
from dramatiq.middleware import AsyncIO
56
from opentelemetry_instrumentor_dramatiq import DramatiqInstrumentor
6-
7+
import orjson
78
from .config import AppConfig
89

910

11+
class ORJSONEncoder(Encoder):
12+
"""Encodes messages as JSON. orjson is much faster than json.
13+
"""
14+
15+
def encode(self, data: MessageData) -> bytes:
16+
return orjson.dumps(data)
17+
18+
def decode(self, data: bytes) -> MessageData:
19+
try:
20+
return orjson.loads(data)
21+
except orjson.JSONDecodeError as e:
22+
raise DecodeError("failed to decode message %r" % (data,), data, e) from None
23+
24+
1025
def init_dramatiq(config: AppConfig):
1126
DramatiqInstrumentor().instrument()
1227
if config.ENVIRONMENT == "test":
@@ -18,3 +33,4 @@ def init_dramatiq(config: AppConfig):
1833
raise RuntimeError("Running a non-test environment without Redis URL set")
1934
broker.add_middleware(AsyncIO())
2035
set_broker(broker)
36+
set_encoder(ORJSONEncoder())

0 commit comments

Comments
 (0)