feat(gateway): NatsWriteConsumer (Core NATS, queue group) (C2)
This commit is contained in:
53
ingestor/adapters/nats_consumer.py
Normal file
53
ingestor/adapters/nats_consumer.py
Normal file
@@ -0,0 +1,53 @@
|
||||
"""NATS input adapter for OPC write commands (contract C2).
|
||||
|
||||
Thin adapter: decode the message JSON and hand the dict to WriteEngine,
|
||||
which is already raise-safe against malformed commands. No metrics of its
|
||||
own — the engine records write metrics; a malformed-JSON drop is logged
|
||||
here. No reconnect logic — nats-py handles reconnection internally.
|
||||
"""
|
||||
|
||||
import json
|
||||
|
||||
import nats
|
||||
from sientia_do.observability.logger import Logger
|
||||
|
||||
from ingestor.engines.write import WriteEngine
|
||||
|
||||
|
||||
class NatsWriteConsumer:
|
||||
def __init__(
|
||||
self,
|
||||
nats_url: str,
|
||||
write_engine: WriteEngine,
|
||||
logger: Logger,
|
||||
subject: str = 'opc.write',
|
||||
queue: str = 'gateway-writers',
|
||||
):
|
||||
self.nats_url = nats_url
|
||||
self.write_engine = write_engine
|
||||
self.logger = logger
|
||||
self.subject = subject
|
||||
self.queue = queue
|
||||
self.nc = None
|
||||
self.sub = None
|
||||
|
||||
async def start(self) -> None:
|
||||
self.nc = await nats.connect(servers=self.nats_url)
|
||||
self.sub = await self.nc.subscribe(self.subject, queue=self.queue, cb=self._handle)
|
||||
self.logger.info(f'NatsWriteConsumer started: subject={self.subject} queue={self.queue}')
|
||||
|
||||
async def _handle(self, msg) -> None:
|
||||
try:
|
||||
payload = json.loads(msg.data)
|
||||
except (ValueError, UnicodeDecodeError) as e:
|
||||
preview = msg.data[:200]
|
||||
self.logger.error(f'NatsWriteConsumer dropped malformed JSON ({e}): {preview!r}')
|
||||
return
|
||||
await self.write_engine.write(payload)
|
||||
|
||||
async def stop(self) -> None:
|
||||
if self.nc is None:
|
||||
return
|
||||
if self.sub is not None:
|
||||
await self.sub.unsubscribe()
|
||||
await self.nc.drain()
|
||||
Reference in New Issue
Block a user