jetstream-api 0.28.0__tar.gz → 0.29.5__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.
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/PKG-INFO +73 -1
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/README.md +72 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/__init__.py +144 -144
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/_codec.py +2 -2
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/_consumer.py +519 -443
- jetstream_api-0.29.5/ilink/_kconn.py +436 -0
- jetstream_api-0.29.5/ilink/_krecords.py +259 -0
- jetstream_api-0.29.5/ilink/_kwire.py +892 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/_propv2.py +66 -9
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/admin.py +77 -11
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/admintopic.py +411 -436
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/common.py +1306 -1364
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/connectivity.py +13 -432
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/exception.py +496 -496
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/msg.py +5 -976
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/pattern.py +6 -6
- jetstream_api-0.29.5/ilink/producer.py +2389 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/properties.py +48 -15
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/qmgr.py +21 -70
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/topic.py +29 -25
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/jetstream_api.egg-info/PKG-INFO +73 -1
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/jetstream_api.egg-info/SOURCES.txt +3 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/pyproject.toml +1 -1
- jetstream_api-0.28.0/ilink/producer.py +0 -4041
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/LICENSE.txt +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/_groupwire.py +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/_qleader.py +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/_throttle.py +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/partitioner.py +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/py.typed +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/ilink/util.py +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/jetstream_api.egg-info/dependency_links.txt +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/jetstream_api.egg-info/requires.txt +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/jetstream_api.egg-info/top_level.txt +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/setup.cfg +0 -0
- {jetstream_api-0.28.0 → jetstream_api-0.29.5}/tests/test_example.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: jetstream-api
|
|
3
|
-
Version: 0.
|
|
3
|
+
Version: 0.29.5
|
|
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
|
|
@@ -60,6 +60,78 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
|
|
|
60
60
|
## 설치 방법
|
|
61
61
|
pip install jetstream-api
|
|
62
62
|
|
|
63
|
+
## 0.29.5 변경 - 패턴 커밋 고침 · 옛 IL 구독 코드 걷기 (자바 v2.25.5 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
64
|
+
|
|
65
|
+
- **패턴 구독에서 토픽이 지워져도 ``commit_sync`` 가 나머지 토픽을 커밋한다.** 떨어진 토픽의 자리가 다음 재가입 전까지 남아, 커밋
|
|
66
|
+
요청 하나가 통째로 ``UNKNOWN_TOPIC_OR_PARTITION`` 으로 실패했다(반환 목록에 모든 토픽, 자동 커밋도 조용히 실패). 이제 지금 구독하는
|
|
67
|
+
토픽 자리만 싣는다.
|
|
68
|
+
- ☠ **공개 API 제거**(0.29.0 부터 아무 데서도 쓰지 않던 옛 IL pub/sub 표면):
|
|
69
|
+
- ``ilink.msg.ILReqTagMsg`` · ``ILMsg.get_req_tag_msg`` (요청 태그 2044)
|
|
70
|
+
- ``ILC`` 상수: ``MIMQ_TOPIC_MESSAGE`` (2022) · ``MIMQ_TOPIC_BATCH_MESSAGE`` (2024) · ``MIMQ_TOPIC_BATCH_V4_MESSAGE`` (2042) ·
|
|
71
|
+
``MIMQ_TOPIC_PUBLISH_V2_MESSAGE`` / ``_ACK_MESSAGE`` (2040 / 2041) · ``MIMQ_REQ_TAG_MESSAGE`` (2044) ·
|
|
72
|
+
``MIMQ_TOPIC_FETCH_MULTI_MESSAGE`` / ``_RESP_MESSAGE`` (2045 / 2046) · ``MIMQ_TOPIC_FETCH_V2_MESSAGE`` / ``_RESP_MESSAGE`` (2048 / 2049) ·
|
|
73
|
+
``MIMQ_CREATE_TOPIC`` · ``MIMQ_REMOVE_TOPIC`` · ``MIMQ_GET_TOPIC_LIST`` · ``MIMQ_GET_TOPIC_PROPERTY`` · ``MIMQ_TOPIC_PUBLISH`` ·
|
|
74
|
+
``MIMQ_TOPIC_SUBSCRIBE`` · ``MIMQ_TOPIC_UNSUBSCRIBE`` · ``MIMQ_TOPIC_READ`` · ``MIMQ_TOPIC_SEEK`` · ``MIMQ_SET_TOPIC_PROPERTY`` ·
|
|
75
|
+
``MIMQ_TOPIC_COMMIT`` · ``MIMQ_INIT_PRODUCER_ID`` (3347 ~ 3355 · 3357 ~ 3359) · ``MIMQ_TOPIC_PUBLISH_ONE`` (3390) ·
|
|
76
|
+
``MIMQ_TOPIC_LEAVE`` (3401) · ``MIMQ_FIND_COORDINATOR`` · ``MIMQ_JOIN_GROUP`` · ``MIMQ_HEARTBEAT`` · ``MIMQ_LEAVE_GROUP`` ·
|
|
77
|
+
``MIMQ_OFFSET_COMMIT`` · ``MIMQ_OFFSET_FETCH`` · ``MIMQ_LIST_OFFSETS`` (3410 ~ 3416) · ``LIST_OFFSETS_EARLIEST`` / ``LATEST``
|
|
78
|
+
- 남는 IL 토픽 코드: 쿼터 지연 신호 2050, ``MIMQ_FLUSH_TOPIC`` (3389) · ``MIMQ_GET_SUBSCRIPTION_LIST`` (3356) ·
|
|
79
|
+
``MIMQ_TOPIC_METADATA`` (3397) · ``MIMQ_DELETE_GROUP`` (3417) · ``MIMQ_DESCRIBE_GROUP`` (3418).
|
|
80
|
+
- 내부: 구독 전용 IL 세션(``<이름>-SUB``) · 요청 태그 계층 · 응답 도착 번호를 걷었다(동작 변화 없음).
|
|
81
|
+
|
|
82
|
+
## 0.29.4 변경 - 토픽 Kafka 설정 키 (자바 v2.25.4 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
83
|
+
|
|
84
|
+
- **토픽 옵션 문자열에 Kafka 이름 키를 쓸 수 있다**(``createTopic`` · ``setTopicProperty`` - ``.`` 이 든 키, 대소문자 그대로). 예
|
|
85
|
+
``"partitions=3;max.message.bytes=4194304;message.timestamp.type=LogAppendTime"``. ``retention.ms`` · ``cleanup.policy`` ·
|
|
86
|
+
``segment.bytes`` 처럼 ILink 속성에 잇는 키는 그 속성으로 가고, 그 밖의 Kafka 전용 키(``max.message.bytes`` ·
|
|
87
|
+
``message.timestamp.*`` · ``*.compaction.lag.ms`` 와 받기만 하는 키)는 엔진 ``KAFKACONFIG`` 로 간다. 모르는 키 · 틀린 값은 엔진이
|
|
88
|
+
``MIMQE_INVALID_PROPERTY`` 로 거절한다. ``setTopicProperty`` 는 준 Kafka 키만 바꾸고(지금 값을 읽어 합쳐 보낸다), 값을 비우면
|
|
89
|
+
(``"max.message.bytes="``) 엔진 기본값으로 돌아간다.
|
|
90
|
+
- 새 메서드 ``getTopicKafkaConfig(topic)`` / ``get_topic_kafka_config`` - 준 Kafka 전용 키를 ``dict`` 로(주지 않은 키는 엔진 기본값).
|
|
91
|
+
|
|
92
|
+
## 0.29.3 변경 - 발행 고침 둘 · 큐 관리자 목록 Kafka 칸 (자바 v2.25.3 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
93
|
+
|
|
94
|
+
- **멱등 producer 가 실패한 배치 하나 때문에 뒤 배치까지 실패시키지 않는다.** 번호를 받은 배치가 실패로 끝나면(혼자서도 토픽
|
|
95
|
+
``max.message.bytes`` 를 넘는 레코드 등) epoch 를 올려 번호를 다시 매기고, 그 사이 ``OUT_OF_ORDER_SEQUENCE`` 로 돌아온 뒤 배치는
|
|
96
|
+
다시 보낸다(Kafka KIP-360 과 같다). 0.29.0 ~ 0.29.2 는 같은 때 나가 있던 배치를 함께 실패로 돌려줬다(100B 300 · 100KB 30 · 1MiB 6 을
|
|
97
|
+
섞으면 132건 실패 → 이제 1MiB 6건만).
|
|
98
|
+
- **생성자가 붙지 못하면 다시 붙는다**(0.21.4 계약 복구). ``requestTimeoutMs`` 안에서 ``reconnectBackoffMs`` 를 두 배씩
|
|
99
|
+
``reconnectBackoffMaxMs`` 까지 늘리며 다시 시도하고, 끝내 못 붙으면 ``ILSessionException("cannot connect to <주소> - <원인>")``.
|
|
100
|
+
0.29.0 ~ 0.29.2 는 첫 실패에서 바로 끝냈다.
|
|
101
|
+
- 큐 관리자 목록(``getQmgrList``)에도 ``kafka`` · ``kafkaHost`` 가 채워진다 - 엔진 7.0.1.3641 이상에만 묻는다(그 전 엔진은 목록에서
|
|
102
|
+
``None``, 단건 ``getQmgrProperty`` 는 3640 부터).
|
|
103
|
+
|
|
104
|
+
## 0.29.2 변경 - 그룹 재가입 중복 전달 고침 (자바 v2.25.2 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
105
|
+
|
|
106
|
+
- **재가입하면 모든 파티션을 내려놓고 다시 받은 파티션도 커밋 자리부터 읽는다**(Kafka classic 그룹 eager 와 같다). 0.29.0 · 0.29.1 은
|
|
107
|
+
멤버가 한 세대를 놓친 뒤(``expiry_ms`` 안에 읽지 않아 그룹에서 빠짐) 같은 파티션을 다시 받으면 지난 자리를 그대로 이어서, 그 사이
|
|
108
|
+
다른 멤버가 읽고 커밋한 몫을 다시 건넸다(COMMIT_IMMEDIATE 에서도). 한 스레드가 두 멤버를 번갈아 읽는 모양에서 잘 드러난다 -
|
|
109
|
+
Kafka 처럼 이 모양은 가입마다 상대를 기다려 느리다. 멤버마다 스레드를 따로 둔다.
|
|
110
|
+
|
|
111
|
+
## 0.29.1 변경 - 문서만 (자바 v2.25.1 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
112
|
+
|
|
113
|
+
- 관리 발행(``publish``)의 "키 UTF-8 69바이트 이하" 문구를 걷었다. 0.29.0 부터 관리 발행도 Kafka Produce 라 키 길이 상한이 없다.
|
|
114
|
+
동작은 0.29.0 과 같다(0.29.0 도 검사하지 않았다).
|
|
115
|
+
- 클러스터는 엔진 7.0.1.3641 이상을 권장한다. 3641 부터 Metadata 의 브로커 목록에 산 노드만 실린다(죽은 노드는 replicas 에 남고
|
|
116
|
+
leader 는 -1). 클라 변경은 없고, 3노드 리더 kill 시험(파이썬 · 자바, acks=all · 멱등)에서 실패 0 · 중복 0 이었다.
|
|
117
|
+
|
|
118
|
+
## 0.29.0 변경 - pub/sub 를 Kafka 와이어로 (자바 v2.25.0 와 같음, 짝 엔진 = Kafka 호환 판 7.0.1.3640 이상 - 1노드 3640 · 3노드 3641 에서 시험) ☠ 호환 깨짐
|
|
119
|
+
|
|
120
|
+
- **pub/sub 는 이제 엔진의 Kafka 통로로만 된다.** 큐 관리자 XML ``Runtime@Kafka="ON"`` 이 필요하다(기본 꺼짐, 재기동 때 적용).
|
|
121
|
+
Kafka 는 큐 관리자 리스너와 같은 포트다. 옛 IL pub/sub 와이어는 엔진에서 없어졌다 - 이 판 전 클라는 Kafka 호환 엔진에 발행 · 구독하지 못하고,
|
|
122
|
+
이 판은 그 전 엔진에 발행 · 구독하지 못한다. 큐 · 관리(토픽 만들기 · 조회 등)는 그대로 IL 와이어다.
|
|
123
|
+
- 이름은 그대로다(``create_producer`` · ``ILTopicProducer`` · ``subscribe`` · ``ILTopicSubscription`` · 패턴 구독). 속만 Kafka 클라다:
|
|
124
|
+
발행 = Produce(RecordBatch v2, 멱등 = InitProducerId), 구독 = Kafka classic 소비자 그룹(range · roundrobin 배정, OffsetCommit/Fetch, ListOffsets).
|
|
125
|
+
같은 구독(그룹) 이름으로 kafka-clients 같은 다른 Kafka 클라이언트가 붙어도 파티션을 함께 나눠 받는다(kafka-clients 3.9.1 과 섞어 쓰기 시험 - none · lz4 · zstd).
|
|
126
|
+
- 클러스터 리더 노드 장애: 발행 · 구독은 메타데이터 · 코디네이터를 다시 찾아 이어 간다(LEADER_NOT_AVAILABLE · COORDINATOR_NOT_AVAILABLE 재시도).
|
|
127
|
+
구독의 가입 · 커밋 · 그룹 관리는 코디네이터를 60초까지 기다린다(Kafka ``default.api.timeout.ms`` 와 같다), 하트비트 · 자동 커밋 · 닫기는 5초.
|
|
128
|
+
- 오류는 Kafka 오류 코드를 ``MIMQE_*`` 토큰으로 바꿔 ``MIMQE_X (kafka NAME(code) where: msg)`` 로 보인다.
|
|
129
|
+
- 새 것: ``ILTopicMsg`` 헤더(Kafka 레코드 헤더, 속성 = 헤더), 큐 관리자 읽기 전용 칸 ``kafka`` · ``kafkaHost`` (GET 에서만).
|
|
130
|
+
- 바뀐 것: 토픽 목록 줄의 넷째 칸이 토픽 epoch 대신 Kafka ``topicId`` (32자 hex, 없으면 ``"-"``), 토픽 상세 PART 줄에 ``hw`` · ``leaderEpoch``.
|
|
131
|
+
관리 단건 발행(``ILAdminTopic.publish``)은 데이터 포트의 Kafka Produce 한 건(acks=1)이라 키 69바이트 상한이 없어졌다.
|
|
132
|
+
그룹 관리(목록 · 상세 · seek · 삭제)도 Kafka 와이어다 - 세대(generation) 칸은 늘 ``""``, 없는 그룹 상세는 상태 Dead.
|
|
133
|
+
- 없앤 것: ``ILMsg`` 의 옛 토픽 메시지 게터와 옛 토픽 메시지 클래스(IL 와이어 전용). lz4 frame 은 원래 크기 칸을 싣지 않는다(Kafka 와 같다).
|
|
134
|
+
|
|
63
135
|
## 0.28.0 변경 - IBMMQ 채널 MQ 인증 · 채널 사유(REASON) · 입력값 오류 표시 (자바 v2.24.0 와 같음, 짝 엔진 7.0.1.3638 이상)
|
|
64
136
|
|
|
65
137
|
- 새 칸: IBMMQ 채널 MQ CONNAUTH ``mqUser`` · ``mqPassword`` (엔진 7.0.1.3638 이상). 둘은 한 쌍이다(한쪽만 있으면 엔진이 ``MIMQE_INVALID_PROPERTY``,
|
|
@@ -10,6 +10,78 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
|
|
|
10
10
|
## 설치 방법
|
|
11
11
|
pip install jetstream-api
|
|
12
12
|
|
|
13
|
+
## 0.29.5 변경 - 패턴 커밋 고침 · 옛 IL 구독 코드 걷기 (자바 v2.25.5 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
14
|
+
|
|
15
|
+
- **패턴 구독에서 토픽이 지워져도 ``commit_sync`` 가 나머지 토픽을 커밋한다.** 떨어진 토픽의 자리가 다음 재가입 전까지 남아, 커밋
|
|
16
|
+
요청 하나가 통째로 ``UNKNOWN_TOPIC_OR_PARTITION`` 으로 실패했다(반환 목록에 모든 토픽, 자동 커밋도 조용히 실패). 이제 지금 구독하는
|
|
17
|
+
토픽 자리만 싣는다.
|
|
18
|
+
- ☠ **공개 API 제거**(0.29.0 부터 아무 데서도 쓰지 않던 옛 IL pub/sub 표면):
|
|
19
|
+
- ``ilink.msg.ILReqTagMsg`` · ``ILMsg.get_req_tag_msg`` (요청 태그 2044)
|
|
20
|
+
- ``ILC`` 상수: ``MIMQ_TOPIC_MESSAGE`` (2022) · ``MIMQ_TOPIC_BATCH_MESSAGE`` (2024) · ``MIMQ_TOPIC_BATCH_V4_MESSAGE`` (2042) ·
|
|
21
|
+
``MIMQ_TOPIC_PUBLISH_V2_MESSAGE`` / ``_ACK_MESSAGE`` (2040 / 2041) · ``MIMQ_REQ_TAG_MESSAGE`` (2044) ·
|
|
22
|
+
``MIMQ_TOPIC_FETCH_MULTI_MESSAGE`` / ``_RESP_MESSAGE`` (2045 / 2046) · ``MIMQ_TOPIC_FETCH_V2_MESSAGE`` / ``_RESP_MESSAGE`` (2048 / 2049) ·
|
|
23
|
+
``MIMQ_CREATE_TOPIC`` · ``MIMQ_REMOVE_TOPIC`` · ``MIMQ_GET_TOPIC_LIST`` · ``MIMQ_GET_TOPIC_PROPERTY`` · ``MIMQ_TOPIC_PUBLISH`` ·
|
|
24
|
+
``MIMQ_TOPIC_SUBSCRIBE`` · ``MIMQ_TOPIC_UNSUBSCRIBE`` · ``MIMQ_TOPIC_READ`` · ``MIMQ_TOPIC_SEEK`` · ``MIMQ_SET_TOPIC_PROPERTY`` ·
|
|
25
|
+
``MIMQ_TOPIC_COMMIT`` · ``MIMQ_INIT_PRODUCER_ID`` (3347 ~ 3355 · 3357 ~ 3359) · ``MIMQ_TOPIC_PUBLISH_ONE`` (3390) ·
|
|
26
|
+
``MIMQ_TOPIC_LEAVE`` (3401) · ``MIMQ_FIND_COORDINATOR`` · ``MIMQ_JOIN_GROUP`` · ``MIMQ_HEARTBEAT`` · ``MIMQ_LEAVE_GROUP`` ·
|
|
27
|
+
``MIMQ_OFFSET_COMMIT`` · ``MIMQ_OFFSET_FETCH`` · ``MIMQ_LIST_OFFSETS`` (3410 ~ 3416) · ``LIST_OFFSETS_EARLIEST`` / ``LATEST``
|
|
28
|
+
- 남는 IL 토픽 코드: 쿼터 지연 신호 2050, ``MIMQ_FLUSH_TOPIC`` (3389) · ``MIMQ_GET_SUBSCRIPTION_LIST`` (3356) ·
|
|
29
|
+
``MIMQ_TOPIC_METADATA`` (3397) · ``MIMQ_DELETE_GROUP`` (3417) · ``MIMQ_DESCRIBE_GROUP`` (3418).
|
|
30
|
+
- 내부: 구독 전용 IL 세션(``<이름>-SUB``) · 요청 태그 계층 · 응답 도착 번호를 걷었다(동작 변화 없음).
|
|
31
|
+
|
|
32
|
+
## 0.29.4 변경 - 토픽 Kafka 설정 키 (자바 v2.25.4 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
33
|
+
|
|
34
|
+
- **토픽 옵션 문자열에 Kafka 이름 키를 쓸 수 있다**(``createTopic`` · ``setTopicProperty`` - ``.`` 이 든 키, 대소문자 그대로). 예
|
|
35
|
+
``"partitions=3;max.message.bytes=4194304;message.timestamp.type=LogAppendTime"``. ``retention.ms`` · ``cleanup.policy`` ·
|
|
36
|
+
``segment.bytes`` 처럼 ILink 속성에 잇는 키는 그 속성으로 가고, 그 밖의 Kafka 전용 키(``max.message.bytes`` ·
|
|
37
|
+
``message.timestamp.*`` · ``*.compaction.lag.ms`` 와 받기만 하는 키)는 엔진 ``KAFKACONFIG`` 로 간다. 모르는 키 · 틀린 값은 엔진이
|
|
38
|
+
``MIMQE_INVALID_PROPERTY`` 로 거절한다. ``setTopicProperty`` 는 준 Kafka 키만 바꾸고(지금 값을 읽어 합쳐 보낸다), 값을 비우면
|
|
39
|
+
(``"max.message.bytes="``) 엔진 기본값으로 돌아간다.
|
|
40
|
+
- 새 메서드 ``getTopicKafkaConfig(topic)`` / ``get_topic_kafka_config`` - 준 Kafka 전용 키를 ``dict`` 로(주지 않은 키는 엔진 기본값).
|
|
41
|
+
|
|
42
|
+
## 0.29.3 변경 - 발행 고침 둘 · 큐 관리자 목록 Kafka 칸 (자바 v2.25.3 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
43
|
+
|
|
44
|
+
- **멱등 producer 가 실패한 배치 하나 때문에 뒤 배치까지 실패시키지 않는다.** 번호를 받은 배치가 실패로 끝나면(혼자서도 토픽
|
|
45
|
+
``max.message.bytes`` 를 넘는 레코드 등) epoch 를 올려 번호를 다시 매기고, 그 사이 ``OUT_OF_ORDER_SEQUENCE`` 로 돌아온 뒤 배치는
|
|
46
|
+
다시 보낸다(Kafka KIP-360 과 같다). 0.29.0 ~ 0.29.2 는 같은 때 나가 있던 배치를 함께 실패로 돌려줬다(100B 300 · 100KB 30 · 1MiB 6 을
|
|
47
|
+
섞으면 132건 실패 → 이제 1MiB 6건만).
|
|
48
|
+
- **생성자가 붙지 못하면 다시 붙는다**(0.21.4 계약 복구). ``requestTimeoutMs`` 안에서 ``reconnectBackoffMs`` 를 두 배씩
|
|
49
|
+
``reconnectBackoffMaxMs`` 까지 늘리며 다시 시도하고, 끝내 못 붙으면 ``ILSessionException("cannot connect to <주소> - <원인>")``.
|
|
50
|
+
0.29.0 ~ 0.29.2 는 첫 실패에서 바로 끝냈다.
|
|
51
|
+
- 큐 관리자 목록(``getQmgrList``)에도 ``kafka`` · ``kafkaHost`` 가 채워진다 - 엔진 7.0.1.3641 이상에만 묻는다(그 전 엔진은 목록에서
|
|
52
|
+
``None``, 단건 ``getQmgrProperty`` 는 3640 부터).
|
|
53
|
+
|
|
54
|
+
## 0.29.2 변경 - 그룹 재가입 중복 전달 고침 (자바 v2.25.2 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
55
|
+
|
|
56
|
+
- **재가입하면 모든 파티션을 내려놓고 다시 받은 파티션도 커밋 자리부터 읽는다**(Kafka classic 그룹 eager 와 같다). 0.29.0 · 0.29.1 은
|
|
57
|
+
멤버가 한 세대를 놓친 뒤(``expiry_ms`` 안에 읽지 않아 그룹에서 빠짐) 같은 파티션을 다시 받으면 지난 자리를 그대로 이어서, 그 사이
|
|
58
|
+
다른 멤버가 읽고 커밋한 몫을 다시 건넸다(COMMIT_IMMEDIATE 에서도). 한 스레드가 두 멤버를 번갈아 읽는 모양에서 잘 드러난다 -
|
|
59
|
+
Kafka 처럼 이 모양은 가입마다 상대를 기다려 느리다. 멤버마다 스레드를 따로 둔다.
|
|
60
|
+
|
|
61
|
+
## 0.29.1 변경 - 문서만 (자바 v2.25.1 와 같음, 짝 엔진 = 0.29.0 과 같음 - 클러스터 권장 7.0.1.3641 이상)
|
|
62
|
+
|
|
63
|
+
- 관리 발행(``publish``)의 "키 UTF-8 69바이트 이하" 문구를 걷었다. 0.29.0 부터 관리 발행도 Kafka Produce 라 키 길이 상한이 없다.
|
|
64
|
+
동작은 0.29.0 과 같다(0.29.0 도 검사하지 않았다).
|
|
65
|
+
- 클러스터는 엔진 7.0.1.3641 이상을 권장한다. 3641 부터 Metadata 의 브로커 목록에 산 노드만 실린다(죽은 노드는 replicas 에 남고
|
|
66
|
+
leader 는 -1). 클라 변경은 없고, 3노드 리더 kill 시험(파이썬 · 자바, acks=all · 멱등)에서 실패 0 · 중복 0 이었다.
|
|
67
|
+
|
|
68
|
+
## 0.29.0 변경 - pub/sub 를 Kafka 와이어로 (자바 v2.25.0 와 같음, 짝 엔진 = Kafka 호환 판 7.0.1.3640 이상 - 1노드 3640 · 3노드 3641 에서 시험) ☠ 호환 깨짐
|
|
69
|
+
|
|
70
|
+
- **pub/sub 는 이제 엔진의 Kafka 통로로만 된다.** 큐 관리자 XML ``Runtime@Kafka="ON"`` 이 필요하다(기본 꺼짐, 재기동 때 적용).
|
|
71
|
+
Kafka 는 큐 관리자 리스너와 같은 포트다. 옛 IL pub/sub 와이어는 엔진에서 없어졌다 - 이 판 전 클라는 Kafka 호환 엔진에 발행 · 구독하지 못하고,
|
|
72
|
+
이 판은 그 전 엔진에 발행 · 구독하지 못한다. 큐 · 관리(토픽 만들기 · 조회 등)는 그대로 IL 와이어다.
|
|
73
|
+
- 이름은 그대로다(``create_producer`` · ``ILTopicProducer`` · ``subscribe`` · ``ILTopicSubscription`` · 패턴 구독). 속만 Kafka 클라다:
|
|
74
|
+
발행 = Produce(RecordBatch v2, 멱등 = InitProducerId), 구독 = Kafka classic 소비자 그룹(range · roundrobin 배정, OffsetCommit/Fetch, ListOffsets).
|
|
75
|
+
같은 구독(그룹) 이름으로 kafka-clients 같은 다른 Kafka 클라이언트가 붙어도 파티션을 함께 나눠 받는다(kafka-clients 3.9.1 과 섞어 쓰기 시험 - none · lz4 · zstd).
|
|
76
|
+
- 클러스터 리더 노드 장애: 발행 · 구독은 메타데이터 · 코디네이터를 다시 찾아 이어 간다(LEADER_NOT_AVAILABLE · COORDINATOR_NOT_AVAILABLE 재시도).
|
|
77
|
+
구독의 가입 · 커밋 · 그룹 관리는 코디네이터를 60초까지 기다린다(Kafka ``default.api.timeout.ms`` 와 같다), 하트비트 · 자동 커밋 · 닫기는 5초.
|
|
78
|
+
- 오류는 Kafka 오류 코드를 ``MIMQE_*`` 토큰으로 바꿔 ``MIMQE_X (kafka NAME(code) where: msg)`` 로 보인다.
|
|
79
|
+
- 새 것: ``ILTopicMsg`` 헤더(Kafka 레코드 헤더, 속성 = 헤더), 큐 관리자 읽기 전용 칸 ``kafka`` · ``kafkaHost`` (GET 에서만).
|
|
80
|
+
- 바뀐 것: 토픽 목록 줄의 넷째 칸이 토픽 epoch 대신 Kafka ``topicId`` (32자 hex, 없으면 ``"-"``), 토픽 상세 PART 줄에 ``hw`` · ``leaderEpoch``.
|
|
81
|
+
관리 단건 발행(``ILAdminTopic.publish``)은 데이터 포트의 Kafka Produce 한 건(acks=1)이라 키 69바이트 상한이 없어졌다.
|
|
82
|
+
그룹 관리(목록 · 상세 · seek · 삭제)도 Kafka 와이어다 - 세대(generation) 칸은 늘 ``""``, 없는 그룹 상세는 상태 Dead.
|
|
83
|
+
- 없앤 것: ``ILMsg`` 의 옛 토픽 메시지 게터와 옛 토픽 메시지 클래스(IL 와이어 전용). lz4 frame 은 원래 크기 칸을 싣지 않는다(Kafka 와 같다).
|
|
84
|
+
|
|
13
85
|
## 0.28.0 변경 - IBMMQ 채널 MQ 인증 · 채널 사유(REASON) · 입력값 오류 표시 (자바 v2.24.0 와 같음, 짝 엔진 7.0.1.3638 이상)
|
|
14
86
|
|
|
15
87
|
- 새 칸: IBMMQ 채널 MQ CONNAUTH ``mqUser`` · ``mqPassword`` (엔진 7.0.1.3638 이상). 둘은 한 쌍이다(한쪽만 있으면 엔진이 ``MIMQE_INVALID_PROPERTY``,
|
|
@@ -1,144 +1,144 @@
|
|
|
1
|
-
"""iLink - Python client API for iLink M.O.M. (Message Oriented Middleware)."""
|
|
2
|
-
|
|
3
|
-
__version__ = "0.
|
|
4
|
-
|
|
5
|
-
# --- Admin / Service ---
|
|
6
|
-
from .admin import ILAdminService, ILAdminQmgr, ILLogBrowser, ILQueueBrowser
|
|
7
|
-
|
|
8
|
-
# --- Queue Manager & Queue ---
|
|
9
|
-
from .qmgr import ILQmgr, ILQueue
|
|
10
|
-
|
|
11
|
-
# --- Message ---
|
|
12
|
-
from .msg import ILMsg, ILMsgUtil
|
|
13
|
-
|
|
14
|
-
# --- Constants & Enums ---
|
|
15
|
-
from .common import ILC, ILCC, ILRC, MatchOption
|
|
16
|
-
|
|
17
|
-
# --- Properties ---
|
|
18
|
-
from .properties import (
|
|
19
|
-
DestItem,
|
|
20
|
-
PartitionItem,
|
|
21
|
-
SegmentItem,
|
|
22
|
-
ILQueueProperty,
|
|
23
|
-
ILChannelProperty,
|
|
24
|
-
ILChannelType,
|
|
25
|
-
ILChannelStatus,
|
|
26
|
-
ILChannelDirection,
|
|
27
|
-
ILChannelSecurity,
|
|
28
|
-
ILChannelBalanceMode,
|
|
29
|
-
ILClusterNode,
|
|
30
|
-
ILClusterControlResult,
|
|
31
|
-
ILClusterDissolveResult,
|
|
32
|
-
ILClusterForceElectResult,
|
|
33
|
-
ILClusterLeadTable,
|
|
34
|
-
ILClusterLeadEntry,
|
|
35
|
-
ILClusterForcedKey,
|
|
36
|
-
ILQuarantineReinjectResult,
|
|
37
|
-
ILClusterJoinResult,
|
|
38
|
-
ILClusterNodeAddResult,
|
|
39
|
-
ILFollowerStatus,
|
|
40
|
-
ILGroupDescription,
|
|
41
|
-
ILGroupInfo,
|
|
42
|
-
ILGroupMember,
|
|
43
|
-
ILGroupOffset,
|
|
44
|
-
ILReplicationStatus,
|
|
45
|
-
ILClusterProperty,
|
|
46
|
-
ILQmgrProperty,
|
|
47
|
-
ILSessionProperty,
|
|
48
|
-
ILServiceProperty,
|
|
49
|
-
ILSpokeProperty,
|
|
50
|
-
ILAccessRuleProperty,
|
|
51
|
-
ILSecureFileProperty,
|
|
52
|
-
ILQueueRealTimeInfo,
|
|
53
|
-
ILQueueFlow,
|
|
54
|
-
ILQmgrDiag,
|
|
55
|
-
ILQuotaProperty,
|
|
56
|
-
ILClientQuota,
|
|
57
|
-
ILQuotaStats,
|
|
58
|
-
ILQuotaMeter,
|
|
59
|
-
ILQuotaFollower,
|
|
60
|
-
ILQuotaRefusedPeer,
|
|
61
|
-
ILPropertyResult,
|
|
62
|
-
ILThrottleStats,
|
|
63
|
-
)
|
|
64
|
-
|
|
65
|
-
# --- Exceptions ---
|
|
66
|
-
from .exception import (
|
|
67
|
-
ILException,
|
|
68
|
-
ILNoMsgException,
|
|
69
|
-
ILTimeoutException,
|
|
70
|
-
ILOperationException,
|
|
71
|
-
ILSessionException,
|
|
72
|
-
ILMsgTypeException,
|
|
73
|
-
)
|
|
74
|
-
|
|
75
|
-
__all__ = [
|
|
76
|
-
# Admin
|
|
77
|
-
"ILAdminService",
|
|
78
|
-
"ILAdminQmgr",
|
|
79
|
-
"ILLogBrowser",
|
|
80
|
-
"ILQueueBrowser",
|
|
81
|
-
# QMgr / Queue
|
|
82
|
-
"ILQmgr",
|
|
83
|
-
"ILQueue",
|
|
84
|
-
# Message
|
|
85
|
-
"ILMsg",
|
|
86
|
-
"ILMsgUtil",
|
|
87
|
-
# Constants
|
|
88
|
-
"ILC",
|
|
89
|
-
"ILCC",
|
|
90
|
-
"ILRC",
|
|
91
|
-
"MatchOption",
|
|
92
|
-
# Properties
|
|
93
|
-
"DestItem",
|
|
94
|
-
"PartitionItem",
|
|
95
|
-
"SegmentItem",
|
|
96
|
-
"ILQueueProperty",
|
|
97
|
-
"ILChannelProperty",
|
|
98
|
-
"ILChannelType",
|
|
99
|
-
"ILChannelStatus",
|
|
100
|
-
"ILChannelDirection",
|
|
101
|
-
"ILChannelSecurity",
|
|
102
|
-
"ILChannelBalanceMode",
|
|
103
|
-
"ILClusterNode",
|
|
104
|
-
"ILClusterControlResult",
|
|
105
|
-
"ILClusterDissolveResult",
|
|
106
|
-
"ILClusterForceElectResult",
|
|
107
|
-
"ILClusterLeadTable",
|
|
108
|
-
"ILClusterLeadEntry",
|
|
109
|
-
"ILClusterForcedKey",
|
|
110
|
-
"ILQuarantineReinjectResult",
|
|
111
|
-
"ILClusterJoinResult",
|
|
112
|
-
"ILClusterNodeAddResult",
|
|
113
|
-
"ILFollowerStatus",
|
|
114
|
-
"ILGroupDescription",
|
|
115
|
-
"ILGroupInfo",
|
|
116
|
-
"ILGroupMember",
|
|
117
|
-
"ILGroupOffset",
|
|
118
|
-
"ILReplicationStatus",
|
|
119
|
-
"ILClusterProperty",
|
|
120
|
-
"ILQmgrProperty",
|
|
121
|
-
"ILSessionProperty",
|
|
122
|
-
"ILServiceProperty",
|
|
123
|
-
"ILSpokeProperty",
|
|
124
|
-
"ILAccessRuleProperty",
|
|
125
|
-
"ILSecureFileProperty",
|
|
126
|
-
"ILQueueRealTimeInfo",
|
|
127
|
-
"ILQueueFlow",
|
|
128
|
-
"ILQmgrDiag",
|
|
129
|
-
"ILQuotaProperty",
|
|
130
|
-
"ILClientQuota",
|
|
131
|
-
"ILQuotaStats",
|
|
132
|
-
"ILQuotaMeter",
|
|
133
|
-
"ILQuotaFollower",
|
|
134
|
-
"ILQuotaRefusedPeer",
|
|
135
|
-
"ILPropertyResult",
|
|
136
|
-
"ILThrottleStats",
|
|
137
|
-
# Exceptions
|
|
138
|
-
"ILException",
|
|
139
|
-
"ILNoMsgException",
|
|
140
|
-
"ILTimeoutException",
|
|
141
|
-
"ILOperationException",
|
|
142
|
-
"ILSessionException",
|
|
143
|
-
"ILMsgTypeException",
|
|
144
|
-
]
|
|
1
|
+
"""iLink - Python client API for iLink M.O.M. (Message Oriented Middleware)."""
|
|
2
|
+
|
|
3
|
+
__version__ = "0.29.5"
|
|
4
|
+
|
|
5
|
+
# --- Admin / Service ---
|
|
6
|
+
from .admin import ILAdminService, ILAdminQmgr, ILLogBrowser, ILQueueBrowser
|
|
7
|
+
|
|
8
|
+
# --- Queue Manager & Queue ---
|
|
9
|
+
from .qmgr import ILQmgr, ILQueue
|
|
10
|
+
|
|
11
|
+
# --- Message ---
|
|
12
|
+
from .msg import ILMsg, ILMsgUtil
|
|
13
|
+
|
|
14
|
+
# --- Constants & Enums ---
|
|
15
|
+
from .common import ILC, ILCC, ILRC, MatchOption
|
|
16
|
+
|
|
17
|
+
# --- Properties ---
|
|
18
|
+
from .properties import (
|
|
19
|
+
DestItem,
|
|
20
|
+
PartitionItem,
|
|
21
|
+
SegmentItem,
|
|
22
|
+
ILQueueProperty,
|
|
23
|
+
ILChannelProperty,
|
|
24
|
+
ILChannelType,
|
|
25
|
+
ILChannelStatus,
|
|
26
|
+
ILChannelDirection,
|
|
27
|
+
ILChannelSecurity,
|
|
28
|
+
ILChannelBalanceMode,
|
|
29
|
+
ILClusterNode,
|
|
30
|
+
ILClusterControlResult,
|
|
31
|
+
ILClusterDissolveResult,
|
|
32
|
+
ILClusterForceElectResult,
|
|
33
|
+
ILClusterLeadTable,
|
|
34
|
+
ILClusterLeadEntry,
|
|
35
|
+
ILClusterForcedKey,
|
|
36
|
+
ILQuarantineReinjectResult,
|
|
37
|
+
ILClusterJoinResult,
|
|
38
|
+
ILClusterNodeAddResult,
|
|
39
|
+
ILFollowerStatus,
|
|
40
|
+
ILGroupDescription,
|
|
41
|
+
ILGroupInfo,
|
|
42
|
+
ILGroupMember,
|
|
43
|
+
ILGroupOffset,
|
|
44
|
+
ILReplicationStatus,
|
|
45
|
+
ILClusterProperty,
|
|
46
|
+
ILQmgrProperty,
|
|
47
|
+
ILSessionProperty,
|
|
48
|
+
ILServiceProperty,
|
|
49
|
+
ILSpokeProperty,
|
|
50
|
+
ILAccessRuleProperty,
|
|
51
|
+
ILSecureFileProperty,
|
|
52
|
+
ILQueueRealTimeInfo,
|
|
53
|
+
ILQueueFlow,
|
|
54
|
+
ILQmgrDiag,
|
|
55
|
+
ILQuotaProperty,
|
|
56
|
+
ILClientQuota,
|
|
57
|
+
ILQuotaStats,
|
|
58
|
+
ILQuotaMeter,
|
|
59
|
+
ILQuotaFollower,
|
|
60
|
+
ILQuotaRefusedPeer,
|
|
61
|
+
ILPropertyResult,
|
|
62
|
+
ILThrottleStats,
|
|
63
|
+
)
|
|
64
|
+
|
|
65
|
+
# --- Exceptions ---
|
|
66
|
+
from .exception import (
|
|
67
|
+
ILException,
|
|
68
|
+
ILNoMsgException,
|
|
69
|
+
ILTimeoutException,
|
|
70
|
+
ILOperationException,
|
|
71
|
+
ILSessionException,
|
|
72
|
+
ILMsgTypeException,
|
|
73
|
+
)
|
|
74
|
+
|
|
75
|
+
__all__ = [
|
|
76
|
+
# Admin
|
|
77
|
+
"ILAdminService",
|
|
78
|
+
"ILAdminQmgr",
|
|
79
|
+
"ILLogBrowser",
|
|
80
|
+
"ILQueueBrowser",
|
|
81
|
+
# QMgr / Queue
|
|
82
|
+
"ILQmgr",
|
|
83
|
+
"ILQueue",
|
|
84
|
+
# Message
|
|
85
|
+
"ILMsg",
|
|
86
|
+
"ILMsgUtil",
|
|
87
|
+
# Constants
|
|
88
|
+
"ILC",
|
|
89
|
+
"ILCC",
|
|
90
|
+
"ILRC",
|
|
91
|
+
"MatchOption",
|
|
92
|
+
# Properties
|
|
93
|
+
"DestItem",
|
|
94
|
+
"PartitionItem",
|
|
95
|
+
"SegmentItem",
|
|
96
|
+
"ILQueueProperty",
|
|
97
|
+
"ILChannelProperty",
|
|
98
|
+
"ILChannelType",
|
|
99
|
+
"ILChannelStatus",
|
|
100
|
+
"ILChannelDirection",
|
|
101
|
+
"ILChannelSecurity",
|
|
102
|
+
"ILChannelBalanceMode",
|
|
103
|
+
"ILClusterNode",
|
|
104
|
+
"ILClusterControlResult",
|
|
105
|
+
"ILClusterDissolveResult",
|
|
106
|
+
"ILClusterForceElectResult",
|
|
107
|
+
"ILClusterLeadTable",
|
|
108
|
+
"ILClusterLeadEntry",
|
|
109
|
+
"ILClusterForcedKey",
|
|
110
|
+
"ILQuarantineReinjectResult",
|
|
111
|
+
"ILClusterJoinResult",
|
|
112
|
+
"ILClusterNodeAddResult",
|
|
113
|
+
"ILFollowerStatus",
|
|
114
|
+
"ILGroupDescription",
|
|
115
|
+
"ILGroupInfo",
|
|
116
|
+
"ILGroupMember",
|
|
117
|
+
"ILGroupOffset",
|
|
118
|
+
"ILReplicationStatus",
|
|
119
|
+
"ILClusterProperty",
|
|
120
|
+
"ILQmgrProperty",
|
|
121
|
+
"ILSessionProperty",
|
|
122
|
+
"ILServiceProperty",
|
|
123
|
+
"ILSpokeProperty",
|
|
124
|
+
"ILAccessRuleProperty",
|
|
125
|
+
"ILSecureFileProperty",
|
|
126
|
+
"ILQueueRealTimeInfo",
|
|
127
|
+
"ILQueueFlow",
|
|
128
|
+
"ILQmgrDiag",
|
|
129
|
+
"ILQuotaProperty",
|
|
130
|
+
"ILClientQuota",
|
|
131
|
+
"ILQuotaStats",
|
|
132
|
+
"ILQuotaMeter",
|
|
133
|
+
"ILQuotaFollower",
|
|
134
|
+
"ILQuotaRefusedPeer",
|
|
135
|
+
"ILPropertyResult",
|
|
136
|
+
"ILThrottleStats",
|
|
137
|
+
# Exceptions
|
|
138
|
+
"ILException",
|
|
139
|
+
"ILNoMsgException",
|
|
140
|
+
"ILTimeoutException",
|
|
141
|
+
"ILOperationException",
|
|
142
|
+
"ILSessionException",
|
|
143
|
+
"ILMsgTypeException",
|
|
144
|
+
]
|
|
@@ -125,7 +125,7 @@ class _Lz4:
|
|
|
125
125
|
self._f = frame
|
|
126
126
|
|
|
127
127
|
def compress(self, data, level: int) -> bytes:
|
|
128
|
-
"""frame 하나로 압축한다(64KB 독립 블록, 원문
|
|
128
|
+
"""frame 하나로 압축한다(64KB 독립 블록, 원문 크기와 체크섬은 싣지 않는다 - Kafka KafkaLZ4BlockOutputStream 과 같은 모양).
|
|
129
129
|
|
|
130
130
|
Args:
|
|
131
131
|
data (bytes | bytearray | memoryview): 압축할 바이트.
|
|
@@ -140,7 +140,7 @@ class _Lz4:
|
|
|
140
140
|
# block_linked 기본값이 True(연결형)라 반드시 끈다 - 자바 lz4-java 는 연결형 frame 을 풀지 못한다
|
|
141
141
|
return f.compress(data, compression_level=0 if level == LZ4_LEVEL_DEFAULT else level,
|
|
142
142
|
block_size=f.BLOCKSIZE_MAX64KB, block_linked=False,
|
|
143
|
-
content_checksum=False, block_checksum=False, store_size=
|
|
143
|
+
content_checksum=False, block_checksum=False, store_size=False)
|
|
144
144
|
|
|
145
145
|
def decompress(self, data, limit: int) -> bytes:
|
|
146
146
|
"""이어 붙인 frame 을 모두 푼다. 원문 크기가 없는 frame 도 된다.
|