jetstream-api 0.6.11__tar.gz → 0.7.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.
Files changed (27) hide show
  1. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/PKG-INFO +56 -7
  2. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/README.md +55 -6
  3. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/__init__.py +1 -1
  4. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/admintopic.py +3 -3
  5. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/common.py +33 -14
  6. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/exception.py +1 -1
  7. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/msg.py +140 -302
  8. jetstream_api-0.7.1/ilink/producer.py +2300 -0
  9. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/qmgr.py +24 -13
  10. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/topic.py +33 -17
  11. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/jetstream_api.egg-info/PKG-INFO +56 -7
  12. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/pyproject.toml +1 -1
  13. jetstream_api-0.6.11/ilink/producer.py +0 -1523
  14. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/LICENSE.txt +0 -0
  15. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/admin.py +0 -0
  16. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/connectivity.py +0 -0
  17. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/partitioner.py +0 -0
  18. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/pattern.py +0 -0
  19. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/properties.py +0 -0
  20. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/py.typed +0 -0
  21. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/ilink/util.py +0 -0
  22. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/jetstream_api.egg-info/SOURCES.txt +0 -0
  23. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/jetstream_api.egg-info/dependency_links.txt +0 -0
  24. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/jetstream_api.egg-info/requires.txt +0 -0
  25. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/jetstream_api.egg-info/top_level.txt +0 -0
  26. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/setup.cfg +0 -0
  27. {jetstream_api-0.6.11 → jetstream_api-0.7.1}/tests/test_example.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jetstream-api
3
- Version: 0.6.11
3
+ Version: 0.7.1
4
4
  Summary: Python client API for iLink M.O.M. (Message Oriented Middleware)
5
5
  Author: snowjeans
6
6
  License: Boost Software License - Version 1.0 - August 17th, 2003
@@ -54,6 +54,55 @@ Python으로 작성된 ILink 클라이언트 API입니다.
54
54
  ## 설치 방법
55
55
  pip install jetstream-api
56
56
 
57
+ ## 0.7.1 변경 - producer 기본값: 멱등 켜짐, batchSize 16384 (자바 v2.3.1 과 같음)
58
+
59
+ - `enableIdempotence` 기본값이 **켜짐**입니다. 멱등을 직접 정하지 않았으면 `acks(0)` 이나 `maxInFlight` 가 5 를 넘을 때
60
+ 멱등이 저절로 꺼집니다. `enableIdempotence(True)` 를 명시하고 그 둘과 함께 쓰면 전처럼 생성 때 `ValueError` 입니다.
61
+ - 멱등이면 토픽을 비우거나(FLUSH) epoch 가 바뀐 순간 걸려 있던 배치를 다시 보내지 않고 실패로 올립니다
62
+ (`MIMQE_TOPIC_FLUSHED` / `MIMQE_TOPIC_EPOCH_MISMATCH`). 0.7.0 기본처럼 조용히 다시 보내려면 `enableIdempotence(False)` 를
63
+ 명시하십시오.
64
+ - `batchSize` 기본값이 **16384** 입니다(파티션 배치 하나의 상한). 0.7.0 은 262144 였습니다 - 처리량이 모자라면
65
+ `batchSize(262144)` 처럼 늘리십시오.
66
+ - producer 수 안내: 한 토픽의 producer(연결)는 1~4개면 충분합니다(엔진 7.0.1.3407 실측).
67
+
68
+ ## 0.7.0 변경 - 발행 v2: producer 하나 = 토픽 하나, 파티션별 배치, 봉투 겹쳐 보내기 (엔진 v2 필요)
69
+
70
+ 발행 경로를 엔진의 새 발행 형식(v2)으로 바꿨습니다. **엔진도 v2 판이어야 합니다** - 옛 엔진에는 발행이 되지 않고
71
+ (`MIMQE_NOT_SUPPORTED`), 옛 클라이언트(0.6.x)는 v2 엔진에 발행할 수 없습니다. 둘을 함께 올리십시오.
72
+
73
+ - **producer 하나 = 토픽 하나 = 연결 하나.** `qmgr.create_producer("ORDER.EVENT", config)` 로 만듭니다. 생성할 때 토픽의
74
+ 파티션 수를 받아 두므로 없는 토픽이면 생성 단계에서 `MIMQE_OBJECT_NOT_FOUND` 로 실패합니다. 토픽이 여러 개면 토픽마다
75
+ producer 를 만듭니다. 한 토픽의 producer(연결)는 1~4개면 충분합니다 - 엔진 7.0.1.3407 실측에서 8개로 늘리면 어느 크기든
76
+ 오히려 줄었습니다. 큰 레코드(1KB 급)는 1개로도 디스크가 먼저 한계에 닿고, 작은 레코드(100B 급)는 4개 근처가 최대입니다.
77
+ - 레코드 토픽이 producer 토픽과 다르면 `send()` 가 `MIMQE_INVALID_ARGUMENT` 로 거부합니다.
78
+ - 옛 `create_producer(config)` / `ILTopicProducer(host, port, name, config)` 모양으로 부르면 `TypeError` 가 납니다.
79
+ - 배치는 **파티션마다** 모입니다. `batchSize`(기본 **262144**, 자바와 같음)는 파티션 배치 하나의 상한입니다. 보낼 때는
80
+ 준비된 파티션 배치들을 봉투 하나에 `maxRequestSize` 까지 싣고, 봉투를 `maxInFlight`(기본 5) 개까지 겹쳐 보냅니다.
81
+ 완결은 I/O 스레드가 하므로 `lingerMs=0` 이어도 `send()` 가 돌아온 시점에 끝나 있다는 보장은 없습니다 - 동기 발행은
82
+ `send(rec).get()` 입니다. `send(rec, callback)` 으로 콜백(`callback(metadata, exc)`)을 걸 수 있습니다.
83
+ - 멱등 발행은 파티션 배치 단위로 번호를 매깁니다. 멱등이면 `maxInFlight` 는 5 이하여야 합니다.
84
+ - 버퍼(`bufferMemory`)가 차면 `send()` 가 `maxBlockMs` 만큼 기다렸다가 `MIMQE_QUEUE_FULL (buffer memory full ...)` 로
85
+ 거부합니다(전에는 그 자리에서 비웠습니다). 부하 문제이므로 다시 시도할 수 있습니다.
86
+ - 크기 상한: 레코드 하나가 혼자 실린 봉투가 `maxRequestSize` 이하, key 와 속성은 각각 99,999바이트까지입니다. 넘으면
87
+ `send()` 가 `MIMQE_MSG_SIZE_OVER (...)` 로 거부합니다. 배치는 토픽 세그먼트 크기에도 맞춰 끊습니다. 봉투 건수 상한(10만 건)은
88
+ 없어졌습니다.
89
+ - 멱등 발행에서 리더가 바뀌는 순간, 팔로워가 거절한 배치 뒤의 배치가 먼저 적재되면 앞 배치는 번호가 틈으로 남습니다. 이 배치는
90
+ `MIMQE_OUT_OF_ORDER_SEQUENCE (sequence gap ...)` 로 **실패**합니다(적재되지 않았습니다). 전에는 이 경우 성공으로 보고되고
91
+ 레코드가 사라질 수 있었습니다.
92
+ - 소비자 배치 읽기가 엔진 저장 v4 응답(2042)을 받습니다. 엔진은 배치를 쪼개지 않아 요청한 개수보다 많이 줄 수 있습니다.
93
+ `read_batch(max, t)` 는 그래도 **max 이하**를 돌려주고, 넘친 레코드는 구독이 들고 있다가 다음 `read` / `read_batch` 가
94
+ 먼저 줍니다. `COMMIT_AUTO` / `COMMIT_MANUAL` 은 앱에 건넨 레코드까지만 커밋하므로 들고 있던 레코드는 끊기면 다시 옵니다.
95
+ `COMMIT_IMMEDIATE` 는 엔진이 읽는 순간 배치 끝까지 커밋하므로 들고 있던 레코드도 이미 커밋된 상태라, 앱에 건네기 전에
96
+ 끊기면 다시 오지 않습니다(at-most-once). `seek` 는 들고 있던 레코드를 버립니다. 옛 배치 응답(2024)은 받지 않습니다 -
97
+ 배치 읽기에는 저장 v4 엔진이 필요합니다.
98
+ - **없어진 API**: `ILTopicFrameMsg` 의 발행 조립(`createPublish`, `buildBatchPublishEnvelope`, `patchPidSeq`,
99
+ `setAckMode`, `setPartition`, `setPidSeq`, `PUBLISH_*_OFFSET`)과 옛 응답 파싱(`getCorrId`, `getResultCode`, `getReason`,
100
+ `getResultPartition` / `Offset` / `Timestamp` / `Reason`), 상수 `ILC.MIMQ_PUBLISH_MESSAGE` / `MIMQ_PUBLISH_ACK_MESSAGE` /
101
+ `MIMQ_BATCH_PUBLISH_MESSAGE` / `MIMQ_BATCH_PUBLISH_ACK_MESSAGE`. `ILTopicFrameMsg` 는 구독 전달 수신 전용이 됐습니다.
102
+ - 추가: `ILTopicProducer.get_topic()` / `get_partition_count()`, `ILC.MIMQ_TOPIC_PUBLISH_V2_MESSAGE`(2040) /
103
+ `MIMQ_TOPIC_PUBLISH_V2_ACK_MESSAGE`(2041), 결과 코드 `ILC.MIMQ_TOPIC_PUBLISH_DUPLICATE`(4164) ~ `FOLLOWER_NODE`(4172),
104
+ `ILC.MIMQ_TOPIC_BATCH_V4_MESSAGE`(2042)와 수신 전용 `ILTopicBatchV4Msg`.
105
+
57
106
  ## 0.6.11 변경 - 메시지 크기 상한(기본 128MiB), 재시도 보호, 클러스터 편의 개선
58
107
 
59
108
  - **메시지(프레임) 크기 상한의 기본값이 128MiB 입니다**(엔진 `Runtime@MaxFrameLength` 기본과 같습니다). 넘는 메시지는 **보내기 전에** `MIMQE_MSG_SIZE_OVER` 로 막고 연결은 그대로 둡니다.
@@ -130,12 +179,12 @@ sub.stop_listening()
130
179
 
131
180
  ### 발행
132
181
 
133
- 발행은 producer 단일 경로입니다. 동기 발행은 `send().get()`을 씁니다.
182
+ 발행은 producer 단일 경로입니다. producer 하나는 토픽 하나에 묶입니다(0.7.0). 동기 발행은 `send().get()`을 씁니다.
134
183
 
135
184
  ```python
136
185
  from ilink.producer import ILProducerConfig, ILProducerRecord
137
186
 
138
- prod = qmgr.create_producer(ILProducerConfig())
187
+ prod = qmgr.create_producer("ORDER.EVENT", ILProducerConfig())
139
188
  meta = prod.send(ILProducerRecord("ORDER.EVENT", "k1", b"payload",
140
189
  properties={"trace-id": "abc"})).get()
141
190
  print(meta.get_partition(), meta.get_offset())
@@ -404,13 +453,13 @@ from ilink.producer import ILProducerConfig
404
453
 
405
454
  cfg = (ILProducerConfig()
406
455
  .acks(1).lingerMs(5).batchSize(32768)
407
- .maxRequestSize(1048576) # 레코드 1건 상한 - 넘으면 send()가 거부
408
- .bufferMemory(33554432) # 미전송 누적 상한
456
+ .maxRequestSize(1048576) # 봉투 하나의 상한(레코드 1건도) - 넘는 레코드는 send()가 거부
457
+ .bufferMemory(33554432) # 미전송 누적 상한 - 차면 maxBlockMs 까지 기다린다
409
458
  .retries(3).retryBackoffMs(100)
410
459
  .deliveryTimeoutMs(120000) # 재시도를 포함한 완결 시한
411
- .enableIdempotence(True)) # PID/시퀀스 중복 제거 (acks=1 필요)
460
+ .enableIdempotence(True)) # PID/시퀀스 중복 제거 (acks=1, maxInFlight 5 이하 필요)
412
461
 
413
- prod = qmgr.create_producer(cfg)
462
+ prod = qmgr.create_producer("ORDER.EVENT", cfg) # 0.7.0: producer 하나 = 토픽 하나
414
463
  print(prod.get_producer_id(), prod.is_connected())
415
464
  ```
416
465
 
@@ -8,6 +8,55 @@ Python으로 작성된 ILink 클라이언트 API입니다.
8
8
  ## 설치 방법
9
9
  pip install jetstream-api
10
10
 
11
+ ## 0.7.1 변경 - producer 기본값: 멱등 켜짐, batchSize 16384 (자바 v2.3.1 과 같음)
12
+
13
+ - `enableIdempotence` 기본값이 **켜짐**입니다. 멱등을 직접 정하지 않았으면 `acks(0)` 이나 `maxInFlight` 가 5 를 넘을 때
14
+ 멱등이 저절로 꺼집니다. `enableIdempotence(True)` 를 명시하고 그 둘과 함께 쓰면 전처럼 생성 때 `ValueError` 입니다.
15
+ - 멱등이면 토픽을 비우거나(FLUSH) epoch 가 바뀐 순간 걸려 있던 배치를 다시 보내지 않고 실패로 올립니다
16
+ (`MIMQE_TOPIC_FLUSHED` / `MIMQE_TOPIC_EPOCH_MISMATCH`). 0.7.0 기본처럼 조용히 다시 보내려면 `enableIdempotence(False)` 를
17
+ 명시하십시오.
18
+ - `batchSize` 기본값이 **16384** 입니다(파티션 배치 하나의 상한). 0.7.0 은 262144 였습니다 - 처리량이 모자라면
19
+ `batchSize(262144)` 처럼 늘리십시오.
20
+ - producer 수 안내: 한 토픽의 producer(연결)는 1~4개면 충분합니다(엔진 7.0.1.3407 실측).
21
+
22
+ ## 0.7.0 변경 - 발행 v2: producer 하나 = 토픽 하나, 파티션별 배치, 봉투 겹쳐 보내기 (엔진 v2 필요)
23
+
24
+ 발행 경로를 엔진의 새 발행 형식(v2)으로 바꿨습니다. **엔진도 v2 판이어야 합니다** - 옛 엔진에는 발행이 되지 않고
25
+ (`MIMQE_NOT_SUPPORTED`), 옛 클라이언트(0.6.x)는 v2 엔진에 발행할 수 없습니다. 둘을 함께 올리십시오.
26
+
27
+ - **producer 하나 = 토픽 하나 = 연결 하나.** `qmgr.create_producer("ORDER.EVENT", config)` 로 만듭니다. 생성할 때 토픽의
28
+ 파티션 수를 받아 두므로 없는 토픽이면 생성 단계에서 `MIMQE_OBJECT_NOT_FOUND` 로 실패합니다. 토픽이 여러 개면 토픽마다
29
+ producer 를 만듭니다. 한 토픽의 producer(연결)는 1~4개면 충분합니다 - 엔진 7.0.1.3407 실측에서 8개로 늘리면 어느 크기든
30
+ 오히려 줄었습니다. 큰 레코드(1KB 급)는 1개로도 디스크가 먼저 한계에 닿고, 작은 레코드(100B 급)는 4개 근처가 최대입니다.
31
+ - 레코드 토픽이 producer 토픽과 다르면 `send()` 가 `MIMQE_INVALID_ARGUMENT` 로 거부합니다.
32
+ - 옛 `create_producer(config)` / `ILTopicProducer(host, port, name, config)` 모양으로 부르면 `TypeError` 가 납니다.
33
+ - 배치는 **파티션마다** 모입니다. `batchSize`(기본 **262144**, 자바와 같음)는 파티션 배치 하나의 상한입니다. 보낼 때는
34
+ 준비된 파티션 배치들을 봉투 하나에 `maxRequestSize` 까지 싣고, 봉투를 `maxInFlight`(기본 5) 개까지 겹쳐 보냅니다.
35
+ 완결은 I/O 스레드가 하므로 `lingerMs=0` 이어도 `send()` 가 돌아온 시점에 끝나 있다는 보장은 없습니다 - 동기 발행은
36
+ `send(rec).get()` 입니다. `send(rec, callback)` 으로 콜백(`callback(metadata, exc)`)을 걸 수 있습니다.
37
+ - 멱등 발행은 파티션 배치 단위로 번호를 매깁니다. 멱등이면 `maxInFlight` 는 5 이하여야 합니다.
38
+ - 버퍼(`bufferMemory`)가 차면 `send()` 가 `maxBlockMs` 만큼 기다렸다가 `MIMQE_QUEUE_FULL (buffer memory full ...)` 로
39
+ 거부합니다(전에는 그 자리에서 비웠습니다). 부하 문제이므로 다시 시도할 수 있습니다.
40
+ - 크기 상한: 레코드 하나가 혼자 실린 봉투가 `maxRequestSize` 이하, key 와 속성은 각각 99,999바이트까지입니다. 넘으면
41
+ `send()` 가 `MIMQE_MSG_SIZE_OVER (...)` 로 거부합니다. 배치는 토픽 세그먼트 크기에도 맞춰 끊습니다. 봉투 건수 상한(10만 건)은
42
+ 없어졌습니다.
43
+ - 멱등 발행에서 리더가 바뀌는 순간, 팔로워가 거절한 배치 뒤의 배치가 먼저 적재되면 앞 배치는 번호가 틈으로 남습니다. 이 배치는
44
+ `MIMQE_OUT_OF_ORDER_SEQUENCE (sequence gap ...)` 로 **실패**합니다(적재되지 않았습니다). 전에는 이 경우 성공으로 보고되고
45
+ 레코드가 사라질 수 있었습니다.
46
+ - 소비자 배치 읽기가 엔진 저장 v4 응답(2042)을 받습니다. 엔진은 배치를 쪼개지 않아 요청한 개수보다 많이 줄 수 있습니다.
47
+ `read_batch(max, t)` 는 그래도 **max 이하**를 돌려주고, 넘친 레코드는 구독이 들고 있다가 다음 `read` / `read_batch` 가
48
+ 먼저 줍니다. `COMMIT_AUTO` / `COMMIT_MANUAL` 은 앱에 건넨 레코드까지만 커밋하므로 들고 있던 레코드는 끊기면 다시 옵니다.
49
+ `COMMIT_IMMEDIATE` 는 엔진이 읽는 순간 배치 끝까지 커밋하므로 들고 있던 레코드도 이미 커밋된 상태라, 앱에 건네기 전에
50
+ 끊기면 다시 오지 않습니다(at-most-once). `seek` 는 들고 있던 레코드를 버립니다. 옛 배치 응답(2024)은 받지 않습니다 -
51
+ 배치 읽기에는 저장 v4 엔진이 필요합니다.
52
+ - **없어진 API**: `ILTopicFrameMsg` 의 발행 조립(`createPublish`, `buildBatchPublishEnvelope`, `patchPidSeq`,
53
+ `setAckMode`, `setPartition`, `setPidSeq`, `PUBLISH_*_OFFSET`)과 옛 응답 파싱(`getCorrId`, `getResultCode`, `getReason`,
54
+ `getResultPartition` / `Offset` / `Timestamp` / `Reason`), 상수 `ILC.MIMQ_PUBLISH_MESSAGE` / `MIMQ_PUBLISH_ACK_MESSAGE` /
55
+ `MIMQ_BATCH_PUBLISH_MESSAGE` / `MIMQ_BATCH_PUBLISH_ACK_MESSAGE`. `ILTopicFrameMsg` 는 구독 전달 수신 전용이 됐습니다.
56
+ - 추가: `ILTopicProducer.get_topic()` / `get_partition_count()`, `ILC.MIMQ_TOPIC_PUBLISH_V2_MESSAGE`(2040) /
57
+ `MIMQ_TOPIC_PUBLISH_V2_ACK_MESSAGE`(2041), 결과 코드 `ILC.MIMQ_TOPIC_PUBLISH_DUPLICATE`(4164) ~ `FOLLOWER_NODE`(4172),
58
+ `ILC.MIMQ_TOPIC_BATCH_V4_MESSAGE`(2042)와 수신 전용 `ILTopicBatchV4Msg`.
59
+
11
60
  ## 0.6.11 변경 - 메시지 크기 상한(기본 128MiB), 재시도 보호, 클러스터 편의 개선
12
61
 
13
62
  - **메시지(프레임) 크기 상한의 기본값이 128MiB 입니다**(엔진 `Runtime@MaxFrameLength` 기본과 같습니다). 넘는 메시지는 **보내기 전에** `MIMQE_MSG_SIZE_OVER` 로 막고 연결은 그대로 둡니다.
@@ -84,12 +133,12 @@ sub.stop_listening()
84
133
 
85
134
  ### 발행
86
135
 
87
- 발행은 producer 단일 경로입니다. 동기 발행은 `send().get()`을 씁니다.
136
+ 발행은 producer 단일 경로입니다. producer 하나는 토픽 하나에 묶입니다(0.7.0). 동기 발행은 `send().get()`을 씁니다.
88
137
 
89
138
  ```python
90
139
  from ilink.producer import ILProducerConfig, ILProducerRecord
91
140
 
92
- prod = qmgr.create_producer(ILProducerConfig())
141
+ prod = qmgr.create_producer("ORDER.EVENT", ILProducerConfig())
93
142
  meta = prod.send(ILProducerRecord("ORDER.EVENT", "k1", b"payload",
94
143
  properties={"trace-id": "abc"})).get()
95
144
  print(meta.get_partition(), meta.get_offset())
@@ -358,13 +407,13 @@ from ilink.producer import ILProducerConfig
358
407
 
359
408
  cfg = (ILProducerConfig()
360
409
  .acks(1).lingerMs(5).batchSize(32768)
361
- .maxRequestSize(1048576) # 레코드 1건 상한 - 넘으면 send()가 거부
362
- .bufferMemory(33554432) # 미전송 누적 상한
410
+ .maxRequestSize(1048576) # 봉투 하나의 상한(레코드 1건도) - 넘는 레코드는 send()가 거부
411
+ .bufferMemory(33554432) # 미전송 누적 상한 - 차면 maxBlockMs 까지 기다린다
363
412
  .retries(3).retryBackoffMs(100)
364
413
  .deliveryTimeoutMs(120000) # 재시도를 포함한 완결 시한
365
- .enableIdempotence(True)) # PID/시퀀스 중복 제거 (acks=1 필요)
414
+ .enableIdempotence(True)) # PID/시퀀스 중복 제거 (acks=1, maxInFlight 5 이하 필요)
366
415
 
367
- prod = qmgr.create_producer(cfg)
416
+ prod = qmgr.create_producer("ORDER.EVENT", cfg) # 0.7.0: producer 하나 = 토픽 하나
368
417
  print(prod.get_producer_id(), prod.is_connected())
369
418
  ```
370
419
 
@@ -1,6 +1,6 @@
1
1
  """iLink - Python client API for iLink M.O.M. (Message Oriented Middleware)."""
2
2
 
3
- __version__ = "0.6.11"
3
+ __version__ = "0.7.1"
4
4
 
5
5
  # --- Admin / Service ---
6
6
  from .admin import ILAdminService, ILAdminQmgr, ILLogBrowser, ILQueueBrowser
@@ -9,9 +9,9 @@
9
9
 
10
10
  .. warning:: 관리 연결에서는 배치가 없다
11
11
 
12
- 레코드 **한 건에 한 번 왕복**한다. 릴레이가 1요청-1응답 고정이라 배치 read
13
- (``TOPIC_BATCH_MESSAGE`` 봉투 + 뒤따르는 프레임 N개)와 배치 발행
14
- (``BATCH_PUBLISH`` 봉투)은 엔진이 ``MIMQE_UNSUPPORTED_ON_RELAY`` 로 거부한다.
12
+ 레코드 **한 건에 한 번 왕복**한다. 이 모듈은 배치 read 요청을 보내지 않고, 발행은
13
+ 단건(``TOPIC_PUBLISH_ONE``)뿐이다. 데이터 연결의 발행 봉투(v2, 2040)는 ilsvc 가
14
+ ``MIMQE_INVALID_MSG_TYPE`` 으로 거절해 큐 관리자에 닿지 않는다.
15
15
 
16
16
  :meth:`ILAdminTopicSubscription.read_batch` 는 제공하지만 **클라이언트가 단건
17
17
  read 를 반복**하는 것이라 왕복 수가 줄지 않는다. 대량 소비가 필요하면 리스너
@@ -51,13 +51,6 @@ class ILC:
51
51
  **파이썬 Enum** ``option`` :class:`MatchOption`
52
52
  채널 속성 :class:`~ilink.properties.ILChannelType` 등
53
53
  ======================= =================== ===================================
54
-
55
- .. warning::
56
-
57
- ``ack_mode`` 는 **같은 이름인데 값 집합이 두 가지**다.
58
- :meth:`~ilink.msg.ILTopicFrameMsg.setAckMode` 는 ``"1"``/``"0"``,
59
- :meth:`~ilink.msg.ILTopicFrameMsg.buildBatchPublishEnvelope` 는
60
- ``"A"``/``"I"``/``"M"`` 를 받는다.
61
54
  """
62
55
 
63
56
  def __init__(self):
@@ -252,15 +245,21 @@ class ILC:
252
245
  MIMQ_REPORT_MESSAGE = 2002
253
246
  MIMQ_LONG_REPORT_MESSAGE = 2003
254
247
  MIMQ_LONG_REQUEST_MESSAGE = 2004
255
- # pub/sub 데이터 평면 전용 타입 (Phase 3~7).
256
- # 단독 PUBLISH(2020)는 엔진이 더 이상 받지 않는다 - 발행은 BATCH_PUBLISH(2025) 봉투로만 간다
257
- # (bare 2020 = 프로토콜 위반으로 연결 종료).
258
- MIMQ_PUBLISH_MESSAGE = 2020
259
- MIMQ_PUBLISH_ACK_MESSAGE = 2021
248
+ # pub/sub 데이터 평면 전용 타입.
249
+ # 0.7.0: 옛 발행 프레임 2020(PUBLISH) / 2021(PUBLISH_ACK) / 2025(BATCH_PUBLISH) / 2026(BATCH_PUBLISH_ACK)은
250
+ # 엔진과 같은 판에서 걷어냈다 - 발행은 아래 2040 / 2041 뿐이다.
260
251
  MIMQ_TOPIC_MESSAGE = 2022
252
+ #: 0.7.0: 저장 v4 엔진은 보내지 않는다(배치 read 응답은 2042). 구독은 받지 않고 ILTopicFrameMsg 의 해석만 남긴다
261
253
  MIMQ_TOPIC_BATCH_MESSAGE = 2024
262
- MIMQ_BATCH_PUBLISH_MESSAGE = 2025
263
- MIMQ_BATCH_PUBLISH_ACK_MESSAGE = 2026
254
+ #: 저장 v4 배치 read 응답(엔진 DESIGN-storv4 §3) = IL 프레임 하나. 본문(이진 BE) = u16 version=4, u16 partCount,
255
+ #: partCount x (i32 partition, i64 startOffset), i32 batchCount, v4 배치 x batchCount. 단건 read 는 그대로 2022 다.
256
+ MIMQ_TOPIC_BATCH_V4_MESSAGE = 2042
257
+ #: 발행 v2 봉투(엔진 DESIGN-pubv2). IL 헤더 + 이진 big-endian 본문(version, acks, flags, corrId, topicEpoch,
258
+ #: 토픽, 파티션 배치 N개 - 배치 = 저장 v4 배치, CRC-32).
259
+ MIMQ_TOPIC_PUBLISH_V2_MESSAGE = 2040
260
+ #: 발행 v2 ACK. corrId + 봉투 code / 사유 + 배치 수 + 배치마다 {partition, code, baseOffset, timestamp,
261
+ #: expectedSeq, 사유}. 봉투 헤더를 못 읽으면 봉투 code / 사유만 싣고 배치 수 0 이다.
262
+ MIMQ_TOPIC_PUBLISH_V2_ACK_MESSAGE = 2041
264
263
  MIMQ_LONG_REQUEST_CODE_LENGTH = 6
265
264
  MIMQ_LONG_REQUEST_ARG_LENGTH = 70
266
265
  MIMQ_LIST_ITEM_COUNT_LENGTH = 5
@@ -465,6 +464,26 @@ class ILC:
465
464
  MIMQ_TOPIC_REBALANCED = 4161
466
465
  MIMQ_OUT_OF_ORDER_SEQUENCE = 4162
467
466
  MIMQ_INVALID_PID = 4163
467
+ # 0.7.0 발행 v2 ACK(2041)의 봉투 / 배치 결과 code(엔진 DESIGN-pubv2 §8.1). 성공 4158, 기타 실패 4159,
468
+ # 순서 오류 4162(expectedSeq), PID 무효 4163 은 위 값을 그대로 쓴다. 실패 code 는 모두 "그 배치는 적재되지 않았다".
469
+ #: 멱등 중복 = 이미 적재됨(성공 계열). 링 밖이면 baseOffset -1
470
+ MIMQ_TOPIC_PUBLISH_DUPLICATE = 4164
471
+ #: FLUSH TOPIC 과 겹침. 비멱등은 재시도, 멱등은 실패
472
+ MIMQ_TOPIC_PUBLISH_FLUSHED = 4165
473
+ #: 토픽 epoch 가 바뀜 - TOPIC_METADATA 를 다시 받는다
474
+ MIMQ_TOPIC_PUBLISH_EPOCH_MISMATCH = 4166
475
+ #: 토픽 없음 또는 지우는 중
476
+ MIMQ_TOPIC_PUBLISH_NOT_FOUND = 4167
477
+ #: key / props 한도, 또는 v3 로 불린 배치가 세그먼트 크기 초과
478
+ MIMQ_TOPIC_PUBLISH_TOO_LARGE = 4168
479
+ #: 파티션 범위 / 중복, pid 섞임, 형식 오류, 컴팩트 토픽 키 없음
480
+ MIMQ_TOPIC_PUBLISH_INVALID_ARGUMENT = 4169
481
+ #: 저장 v4: 엔진이 늘 검사한다(flags bit0 무시)
482
+ MIMQ_TOPIC_PUBLISH_CRC_MISMATCH = 4170
483
+ #: 디스크 가드. 연결은 유지된다
484
+ MIMQ_TOPIC_PUBLISH_SUSPENDED = 4171
485
+ #: 사유에 leader=h:p
486
+ MIMQ_TOPIC_PUBLISH_FOLLOWER_NODE = 4172
468
487
 
469
488
  MIMQ_REMOVE_SESSION = 3309
470
489
  MIMQ_SET_CHANNEL_TIMEOUT = 3310
@@ -213,7 +213,7 @@ class ILMsgTypeException(Exception):
213
213
  type_code (int): 실제로 받은 메시지 종류. **정수 상수**다 -
214
214
  :data:`ILC.MIMQ_DATA_MESSAGE` (2000) /
215
215
  :data:`ILC.MIMQ_REPORT_MESSAGE` (2002) /
216
- :data:`ILC.MIMQ_PUBLISH_MESSAGE` (2020) 등 ``MIMQ_*_MESSAGE`` 계열.
216
+ :data:`ILC.MIMQ_TOPIC_MESSAGE` (2022) 등 ``MIMQ_*_MESSAGE`` 계열.
217
217
  msg (str): 오류 메시지.
218
218
  """
219
219
  super().__init__(msg)