serverish 2.2.0__tar.gz → 2.2.1__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- {serverish-2.2.0 → serverish-2.2.1}/PKG-INFO +1 -1
- {serverish-2.2.0 → serverish-2.2.1}/pyproject.toml +1 -1
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/messenger.py +8 -1
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_publisher.py +5 -1
- {serverish-2.2.0 → serverish-2.2.1}/LICENSE +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/README.md +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/__init__.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/__init__.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/asyncio_util_functions.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/collector.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/datetime.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/exceptions.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/fifoset.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/hasstatuses.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/idmanger.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/iterators.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/manageable.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/singleton.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/status.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/base/task_manager.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/connection/__init__.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/connection/connection.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/connection/connection_jets.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/connection/connection_nats.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/__init__.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/live_document.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/logging.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_callback_sub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_cmd_pub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_cmd_sub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_core_pub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_core_read.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_core_sub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_document_read.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_journal_pub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_journal_read.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_kv.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_kv_read.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_kv_store.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_kv_sub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_progress_pub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_progress_read.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_reader.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_rpc_req.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_rpc_resp.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_single_pub.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msg_single_read.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/messenger/msgvalidator.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/monitoring/__init__.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/monitoring/bridge.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/monitoring/factory.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/monitoring/monitored.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/monitoring/monitored_nats.py +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/config.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/default.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/include/timestamp.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/journal.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/meta.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/program_current_state.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/program_state.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/progress.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/schema/telemetry.schema.json +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/services/TODO.txt +0 -0
- {serverish-2.2.0 → serverish-2.2.1}/serverish/slog.py +0 -0
|
@@ -24,7 +24,7 @@ from nats.aio.msg import Msg
|
|
|
24
24
|
from serverish.base import dt_utcnow_array, dt_from_array, Task, create_task, dt_ensure_array
|
|
25
25
|
from serverish.base.collector import Collector
|
|
26
26
|
from serverish.connection.connection_jets import ConnectionJetStream
|
|
27
|
-
from serverish.base.idmanger import gen_id
|
|
27
|
+
from serverish.base.idmanger import gen_id, gen_uid
|
|
28
28
|
from serverish.base.manageable import Manageable
|
|
29
29
|
from serverish.messenger.msgvalidator import MsgValidator
|
|
30
30
|
from serverish.base.singleton import Singleton
|
|
@@ -51,6 +51,13 @@ class Messenger(Singleton):
|
|
|
51
51
|
def __init__(self, name: str = None, parent: Collector = None, **kwargs) -> None:
|
|
52
52
|
self.validator = MsgValidator()
|
|
53
53
|
self.opener_task: Task | None = None
|
|
54
|
+
# Random per-process token, part of the Nats-Msg-Id dedup header.
|
|
55
|
+
# meta.id (gen_id) is only process-locally unique - two processes (or one
|
|
56
|
+
# process restarted within the stream's duplicate window) both emit
|
|
57
|
+
# 'msg-1', 'msg-2', ..., and JetStream would silently drop the later
|
|
58
|
+
# publishes as duplicates. The instance prefix makes the dedup identity
|
|
59
|
+
# global while retries still reuse the exact same header.
|
|
60
|
+
self.instance_id: str = gen_uid('mi', 12)
|
|
54
61
|
super().__init__(name, parent, **kwargs)
|
|
55
62
|
|
|
56
63
|
@property
|
|
@@ -75,7 +75,11 @@ class MsgPublisher(MsgDriver):
|
|
|
75
75
|
raise e
|
|
76
76
|
self.messenger.log_msg_trace(msg['data'], msg['meta'], f"PUB to {self.subject}")
|
|
77
77
|
headers = dict(kwargs.pop('headers', None) or {})
|
|
78
|
-
|
|
78
|
+
# Server-side dedup id: makes ack-timeout retries safe. Must be globally
|
|
79
|
+
# unique, hence the per-process instance prefix - meta.id alone is only
|
|
80
|
+
# process-locally unique and would collide across processes/restarts,
|
|
81
|
+
# silently dropping messages within the stream's duplicate window.
|
|
82
|
+
headers.setdefault('Nats-Msg-Id', f"{self.messenger.instance_id}:{msg['meta']['id']}")
|
|
79
83
|
try:
|
|
80
84
|
await self._publish_with_ack_retries(bdata, headers, msg['meta']['id'], **kwargs)
|
|
81
85
|
# Track successful publish
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|