jetstream-api 0.18.0__tar.gz → 0.19.2__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.18.0 → jetstream_api-0.19.2}/PKG-INFO +135 -3
- jetstream_api-0.18.0/jetstream_api.egg-info/PKG-INFO → jetstream_api-0.19.2/README.md +986 -904
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/__init__.py +19 -5
- jetstream_api-0.19.2/ilink/_consumer.py +997 -0
- jetstream_api-0.19.2/ilink/_groupwire.py +223 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/admin.py +589 -151
- jetstream_api-0.19.2/ilink/admintopic.py +438 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/common.py +75 -23
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/exception.py +3 -1
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/msg.py +3443 -3277
- jetstream_api-0.19.2/ilink/pattern.py +832 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/producer.py +785 -187
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/properties.py +6207 -6183
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/qmgr.py +30 -5
- jetstream_api-0.19.2/ilink/topic.py +1138 -0
- jetstream_api-0.18.0/README.md → jetstream_api-0.19.2/jetstream_api.egg-info/PKG-INFO +1036 -854
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/jetstream_api.egg-info/SOURCES.txt +2 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/pyproject.toml +1 -1
- jetstream_api-0.18.0/ilink/admintopic.py +0 -647
- jetstream_api-0.18.0/ilink/pattern.py +0 -1210
- jetstream_api-0.18.0/ilink/topic.py +0 -1740
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/LICENSE.txt +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/_codec.py +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/connectivity.py +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/partitioner.py +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/py.typed +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/ilink/util.py +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/jetstream_api.egg-info/dependency_links.txt +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/jetstream_api.egg-info/requires.txt +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/jetstream_api.egg-info/top_level.txt +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/setup.cfg +0 -0
- {jetstream_api-0.18.0 → jetstream_api-0.19.2}/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.19.2
|
|
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,136 @@ lz4 배치 압축을 쓰려면 `pip install "jetstream-api[lz4]"`, zstd 배치
|
|
|
60
60
|
## 설치 방법
|
|
61
61
|
pip install jetstream-api
|
|
62
62
|
|
|
63
|
+
## 0.19.2 변경 - 소비 v2(그룹 코디네이터 · 클라가 읽는 자리를 든다), 발행 다중 연결 (자바 v2.15.2 와 같음, 짝 엔진 7.0.1.3512)
|
|
64
|
+
|
|
65
|
+
> 0.19.0 · 0.19.1 은 시험 저장소(test.pypi)에만 올렸고 배포하지 않았습니다 - 그 뒤 찾은 결함을 고쳐 이 판으로 냅니다:
|
|
66
|
+
> `getSubscriptionList` 가 커밋 없이 배정만 받은 그룹을 빠뜨림, 클러스터 스위치백 뒤 발행이 팔로워 거절을 받은 연결에 붙어
|
|
67
|
+
> 복구되지 않음(0.18.1 은 곧 복구), 페일오버 뒤 발행 연결이 옛 리더에 남음(0.19.1).
|
|
68
|
+
|
|
69
|
+
> ☠ **짝 엔진은 0.18.x 이하 클라의 토픽 소비를 거절합니다** - REPORT 4157,
|
|
70
|
+
> `MIMQE_UNSUPPORTED (consumer protocol v2 - upgrade client)`. 이 판과 그 엔진은 짝으로 올리십시오.
|
|
71
|
+
> 옛 대응표: 저장소의 `MIGRATION-0.19.md`.
|
|
72
|
+
|
|
73
|
+
- **토픽 소비가 그룹 모델로 바뀝니다.** 호출 이름과 인자는 그대로입니다(`subscribe` / `read` / `read_batch` / `commit` /
|
|
74
|
+
`commit_offset` / `seek_to_offset` / `seek_to_time` / `assign` / `close` / `unsubscribe`). 속이 바뀝니다:
|
|
75
|
+
- 구독 이름 = **그룹 이름**. 클라가 파티션별 다음 오프셋을 들고, 가입 · 하트비트 · 커밋은 그룹 코디네이터와, 읽기는 파티션
|
|
76
|
+
리더에서 합니다. 커밋 저장값은 **다음에 읽을 오프셋**입니다(`commit_offset(p, 50)` → 51).
|
|
77
|
+
- `COMMIT_AUTO` = **주기 커밋**(새 옵션 `autoCommitIntervalMs`, 기본 5초) + 재배정 직전 · `close` 때. 재전달 폭이 최대 한 주기로 넓어집니다.
|
|
78
|
+
- `COMMIT_IMMEDIATE` = 받은 배치를 건네기 전에 커밋(fetch 마다 왕복 하나). `durable(False)` = 임시 그룹(마지막 멤버가 닫을 때 그룹 삭제).
|
|
79
|
+
- `expiryMs` = read 사이 최대 시간(넘으면 클라가 스스로 그룹에서 빠지고 다음 read 에 다시 가입, 0 = 5분).
|
|
80
|
+
- `seek_*` 는 클라 위치만 바꿉니다(서버 왕복 없음, 시각은 LIST_OFFSETS). `unsubscribe` = 그룹 삭제(다른 멤버가 있으면
|
|
81
|
+
`MIMQE_GROUP_NOT_EMPTY (N active members)`).
|
|
82
|
+
- 재배정은 먼저 쥔 멤버가 다시 가입해야 넘어갑니다 - **두 번째 멤버가 배정을 받기까지 몇 초**(실측 약 6초) 걸립니다.
|
|
83
|
+
- 코디네이터 이동(4175) · 로딩(4176) · 파티션 리더 이동 · 범위 밖 오프셋은 클라가 감춥니다. 재배정 / 세대 불일치(4161 / 4178)는
|
|
84
|
+
**수동 커밋에서만 예외**로 드러납니다(`MIMQE_TOPIC_REBALANCED (...)`).
|
|
85
|
+
- 구독(그룹) 이름 규칙은 엔진이 검사합니다: 빈 이름, 제어 문자, `| , : ;` 는 `MIMQE_INVALID_ARGUMENT (Group : byte 0x.. not allowed (|,:; ctrl))`
|
|
86
|
+
로 거절됩니다(한글 허용). 토픽을 지우거나 FLUSH 하면 그 토픽의 그룹 커밋도 지워집니다 - 같은 이름으로 다시 만든 토픽은 처음부터 읽습니다.
|
|
87
|
+
- **관리 API 에 구독 그룹 관리가 생깁니다**: `getGroupList` · `describeGroup`(없는 그룹은 거절 없이 상태 `Dead`) · `seekGroup` ·
|
|
88
|
+
`seekGroupToTime` · `deleteGroup`(모두 **활성 멤버가 없을 때만** 옮기기 · 삭제), 정보 클래스 `ILGroupInfo` / `ILGroupMember` /
|
|
89
|
+
`ILGroupOffset` / `ILGroupDescription`. 그룹 요청은 큐 관리자 **데이터 포트**로 잠깐 연결해 보냅니다.
|
|
90
|
+
- ☠ **`getSubscriptionList(topic)` 의 줄 형식이 바뀌었습니다**: `group|state|partition|commit|lag|members=N`(그룹 x 파티션).
|
|
91
|
+
그 토픽에 커밋이 있거나 그 토픽 파티션을 배정받은 멤버가 있는 그룹이 나오고(배정만 받고 커밋이 없으면 commit / lag 이 -1),
|
|
92
|
+
그런 그룹이 없으면 빈 문자열입니다. 파싱하던 코드는 고치거나 `describeGroup` 을 쓰십시오.
|
|
93
|
+
- ☠ **큐 관리자 속성 `memberExpiryMinutes`(분)가 `subGroupTimeoutSec`(초, 기본 30, 1~300)으로 바뀌었습니다**(엔진
|
|
94
|
+
`SUBGROUPTIMEOUT`, 옛 `MEMBEREXPIRY` 는 없어짐). 같은 칸이고 **단위가 분에서 초로** 바뀌었습니다 - 옛 클라로 분 값(예: 5)을
|
|
95
|
+
넣으면 5초가 됩니다. 변경은 곧바로 반영되고, 이미 가입한 멤버는 다음 재가입부터 새 값을 씁니다.
|
|
96
|
+
- 패턴 구독: `SYSTEM.` 으로 시작하는 내부 토픽(예: 그룹 커밋을 적는 `SYSTEM.GROUPS`)은 **패턴이 `SYSTEM.` 으로 시작할 때만**
|
|
97
|
+
잡습니다 - `*` 는 더 이상 잡지 않습니다.
|
|
98
|
+
- 발행: 엔진이 파티션 리더 표를 주면 **리더 노드마다 연결을 하나씩 더 열어** 각 파티션 배치를 그 리더로 보냅니다(공개 API
|
|
99
|
+
무변경). 멱등에서 한 번도 받아들여지지 않은 파티션은 배치 하나만 응답을 기다립니다(첫 번호 틈 방지). 팔로워 거절
|
|
100
|
+
(`MIMQE_FOLLOWER_NODE`)을 받은 연결은 엔진이 그 뒤로도 거절하므로, 그 연결의 응답 대기가 끝나면 닫고 다시 엽니다 - 거절된
|
|
101
|
+
배치는 같은 번호로 새 리더(또는 다시 연 연결)에 나갑니다. 다시 붙을 때는 파티션 리더가 가장 많은 노드(페일오버 뒤 새 리더)로
|
|
102
|
+
붙고, 리더 표에 없는 연결은 한가해지면 닫습니다 - 페일오버 뒤 옛 리더에 연결이 남지 않습니다.
|
|
103
|
+
|
|
104
|
+
### 0.18.2 로 예정했던 문서 정리(배포되지 않아 이 판에 함께 들어갑니다)
|
|
105
|
+
|
|
106
|
+
- `setClusterProperty` / `addNode` / `removeNode` / `setCoords` 등의 `MIMQE_CLUSTER_NOT_COMMITTED` 는 괄호 속 꼬리로 가르십시오.
|
|
107
|
+
- `(not committed - retry)`: **아직 확정 안 됨 - 늦게 확정될 수 있습니다**(적용 안 됨이 아닙니다).
|
|
108
|
+
- `(outcome unknown - check VIEW CLUSTER)`: 요청을 보낸 뒤 답을 잃어 **결과를 모릅니다**.
|
|
109
|
+
- 두 경우 모두 `getClusterProperty` 로 다시 읽어 확인하고, 필요하면 **읽은 판 그대로** 다시 보내면 안전합니다(먼저 것이
|
|
110
|
+
확정됐으면 `MIMQE_CLUSTER_DEF_MOVED` 로 갈립니다). 새로 읽어 고치는 편의 함수(`addNode` 등)를 다시 부르면, 먼저 것이
|
|
111
|
+
확정됐을 때 `(qmgr or address is node N's)` 처럼 거절될 수 있습니다 - 중복은 생기지 않습니다.
|
|
112
|
+
- `(earlier change still pending - retry)`: 앞 변경이 아직 확정 전이라 **이번 것은 올리지 않았습니다** - 그대로 다시 보내도
|
|
113
|
+
안전합니다.
|
|
114
|
+
- `joinCluster` 는 `createCluster` 직후 기다리지 않고 불러도 됩니다. 컨트롤러에 닿지 않으면 엔진이
|
|
115
|
+
최대 약 15초 다시 물은 뒤 `MIMQE_CLUSTER_UNREACHABLE` 로 답합니다.
|
|
116
|
+
- 정지한 큐 관리자에 보낸 조회(예: `getReplicationStatus`)는 `MIMQE_QMGR_NOT_RUNNING (<큐 관리자>)` 로 거절됩니다.
|
|
117
|
+
- 문서에서 개발 중인 옛 7.x 엔진 판의 동작 설명("엔진 7.0.1.35xx 전에는 ...")을 걷어 냈습니다. 설명은 최신 엔진 기준입니다.
|
|
118
|
+
|
|
119
|
+
## 0.18.1 변경 - 클러스터 정지 중 발행 결과 처리, 판사 모델 잔재 제거 (자바 v2.14.1 과 같음)
|
|
120
|
+
|
|
121
|
+
- ☠ **엔진 7.0.1.3484 이상의 클러스터에서 발행한다면 0.18.1 로 올리십시오.** 그 엔진은 클러스터가 멈춘 동안의 발행에
|
|
122
|
+
결과 코드 둘을 새로 줍니다 - `MIMQE_CLUSTER_HALTED` (적재 안 됨) 와, 사유에 `commit in doubt` 가 붙은 것 (**적재됐을 수
|
|
123
|
+
있음**). 0.18.0 은 둘 다 모르는 코드라 뒤의 것을 "적재 안 됨" 으로 읽고, 그다음 발행이 멀쩡한데도
|
|
124
|
+
`MIMQE_OUT_OF_ORDER_SEQUENCE (sequence gap ...)` 로 실패할 수 있었습니다.
|
|
125
|
+
- 두 경우 모두 producer 가 **같은 번호로** 다시 보냅니다(`retries` / `deliveryTimeoutMs` 안에서). 멱등이면 적재됐던 것은
|
|
126
|
+
엔진이 중복으로 알아보고 한 번만 남습니다. 예산을 다 써서 실패로 끝나면, 한 번이라도 결과를 몰랐던 레코드는 오류 사유에
|
|
127
|
+
`commit in doubt` 가 들어갑니다 - 그 레코드는 **들어갔을 수 있습니다.** 중복을 걸러 낼 수 있을 때만 다시 보내십시오.
|
|
128
|
+
비멱등 producer 는 연결이 끊겼을 때처럼 다시 보내므로 중복될 수 있습니다.
|
|
129
|
+
- 큐 put / commit 도 클러스터에서 `MIMQE_CLUSTER_HALTED (...)` 로 실패할 수 있습니다(자동커밋 put 포함). 사유 코드로는
|
|
130
|
+
`MIMQE_REMOTE_OPERATION_FAILURE` 로 분류되므로 `get_report_msg()` 의 문자열로 가르십시오. `commit in doubt` 면 결과를
|
|
131
|
+
모르는 것입니다. `MIMQE_CLUSTER_HALTED (leader changed - commit not applied)`(엔진 7.0.1.3500 부터)는 커밋 직전에 리더가
|
|
132
|
+
바뀌어 **적용하지 않은 것**이라 다시 보내도 안전합니다 - `commit in doubt` 와 섞지 마십시오.
|
|
133
|
+
- ☠ **`deliveryTimeoutMs` 를 `lingerMs + requestTimeoutMs` 보다 작게 명시하면 producer 생성이 `ValueError` 로 거절됩니다.**
|
|
134
|
+
보낸 요청은 `requestTimeoutMs` 까지 답을 기다리므로, 그보다 짧은 전달 시한은 뜻을 지킬 수 없습니다. 명시하지 않았으면
|
|
135
|
+
그 합까지 저절로 늘어납니다(기본 120초는 그대로입니다). 짧은 전달 시한이 필요하면 `requestTimeoutMs` 도 함께 줄이십시오.
|
|
136
|
+
- **전달 시한은 보낸 뒤 답을 기다리는 동안에도 셉니다.** 엔진이 요청을 붙잡고 있어도(클러스터 확정 대기 등) 시한이 지나면
|
|
137
|
+
그 레코드를 실패로 끝내고, 사유에 `commit in doubt` 가 붙습니다 - 이미 적재됐을 수 있습니다. 전에는 답이 올 때까지 끝나지
|
|
138
|
+
않았습니다.
|
|
139
|
+
- 발행을 기다리다 끝난 `get(timeout)` 은 이제 `MIMQC_NORMAL (MIMQE_WAIT_TIMEOUT) publish not completed within N ms - still in
|
|
140
|
+
progress, last answer: ...` 로 보입니다. 전에는 `MIMQC_FATAL_ERROR (MIMQE_INTERNAL_ERROR)` 로 찍혀 내부 오류와 구별되지
|
|
141
|
+
않았습니다. 기다림만 끝난 것이라 레코드는 뒤에서 계속 나갑니다.
|
|
142
|
+
- **세션 타임아웃은 15초 이상으로 두십시오.** 팔로워가 떨어진 직후나 컨트롤러가 바뀌는 동안 엔진은 쓰기를 거절하지 않고
|
|
143
|
+
잠깐(최악 약 11초) 붙잡았다가 성공시킵니다. 이보다 짧게 두면 클라이언트가 먼저 끊고 다시 보내 **중복**될 수 있습니다.
|
|
144
|
+
기본값 30초는 괜찮습니다.
|
|
145
|
+
- **`retries` 를 작게 둔 producer 가 연결 끊김이나 리더 교체에 멈추지 않습니다.** 횟수는 배치마다 세고, 다 쓴 배치만
|
|
146
|
+
실패합니다. producer 는 다시 붙어(리더로) 아직 안 보낸 배치와 뒤 `send` 를 계속 보냅니다. `retries(0)` 이면 그때 보내
|
|
147
|
+
놓았던 배치만 실패합니다 - 팔로워 거절이면 `MIMQE_FOLLOWER_NODE (...) - not stored`(적재 안 됨), 답 없이 끊겼으면
|
|
148
|
+
`MIMQE_SOCKET_CLOSED (... commit in doubt ...)`(적재됐을 수 있음)입니다. 전에는 끊김 한 번에 producer 가 멈추고 큐에
|
|
149
|
+
있던 레코드까지 모두 `MIMQC_FATAL_ERROR (MIMQE_INTERNAL_ERROR)` 로 실패했습니다. 다시 붙는 시도 횟수는 `retries` 로
|
|
150
|
+
막지 않습니다 - 기다리는 레코드는 `deliveryTimeoutMs` 에 끝납니다.
|
|
151
|
+
- producer 의 후보 주소 목록을 **재접속할 때마다 새로 만듭니다.** 전에는 클러스터에서 빠진 노드가 producer 가 살아 있는
|
|
152
|
+
동안 후보에 남았습니다. 생성할 때 준 주소는 늘 남습니다.
|
|
153
|
+
- **없어진 API**: `ILAdminService.getClusterDefDiag` / `get_cluster_def_diag`, `ILClusterDefDiag`, `ILClusterPeerDef`.
|
|
154
|
+
판사 · 조정자 모델 전용이었고, 엔진 7.0.1.3463 부터 응답 형식이 바뀌어 **그 뒤로는 늘 `MIMQE_NOT_SUPPORTED` 로 실패**했습니다.
|
|
155
|
+
정의가 서비스마다 맞는지는 `getClusterProperty()` 의 `(defTerm, defVersion)` 과 `signature` 를 서비스끼리 견주어 보십시오.
|
|
156
|
+
- `ILClusterProperty.getActingCoordinator()` 는 **폐기 예정**입니다(부를 때 `DeprecationWarning`). 엔진 7.0.1.3484 부터 늘
|
|
157
|
+
`None` 입니다 - `controllerLeader` 를 읽으십시오.
|
|
158
|
+
- **클러스터는 한 서비스에서만 `createCluster` 로 만들고, 나머지 서비스는 새 `joinCluster(name, "host:ctrlPort")` 로
|
|
159
|
+
붙습니다**(엔진 7.0.1.3487 이상). 정의를 손으로 복사할 필요가 없습니다. 다른 컨트롤러가 멈춰 있는 동안 다른
|
|
160
|
+
서비스에서 같은 정의로 `createCluster` 를 하면 **별개 클러스터**가 생길 수 있습니다 - 둘째부터는 꼭 `joinCluster` 입니다.
|
|
161
|
+
- **클러스터 전체 해산은 새 `dissolveCluster(name)` 입니다**(엔진 7.0.1.3487 이상). `removeCluster` 는 전처럼 **이 서비스의
|
|
162
|
+
사본만** 지우며, 그 엔진부터는 이 서비스의 큐 관리자가 클러스터 소속에서 곧바로 풀립니다(정지하지는 않습니다).
|
|
163
|
+
옛 엔진에 `dissolveCluster` 를 보내면 사본 하나만 지워지므로 성공으로 돌려주지 않고 `MIMQE_NOT_SUPPORTED` 로 알립니다.
|
|
164
|
+
- **컨트롤러 노드와 투표자를 바꿀 수 있습니다**(엔진 7.0.1.3490 이상): `addNode(name, node)` / `removeNode(name, n)` /
|
|
165
|
+
`setCoords(name, [n,..])`. 한 번에 한 종류만 되므로 **투표자 추가는 `addNode` → `setCoords`, 투표자 제거는 `setCoords` →
|
|
166
|
+
`removeNode`** 두 단계입니다. 새 자리를 맡을 서비스에서
|
|
167
|
+
`addNode` 를 부르면 그 서비스가 곧바로 자리를 맡고(엔진 7.0.1.3492 이상), 결과의 `isClaimed()` 로 알 수 있습니다.
|
|
168
|
+
- **브로커(큐 관리자 노드)도 `addNode` / `removeNode` 로 더하고 뺍니다**(엔진 7.0.1.3500 이상, 최대 9개). 투표권 없이
|
|
169
|
+
들어오고, 더하는 큐 관리자는 **사용자 오브젝트가 없는 새 큐 관리자**여야 합니다(`... (N user objects - add an empty
|
|
170
|
+
qmgr)`). 그 큐 관리자가 있는 서비스가 이미 클러스터 사본을 가졌으면 저절로 합류하고, 아니면 그 서비스에서
|
|
171
|
+
`joinCluster` 합니다. 리더 브로커는 뺄 수 없으니 먼저 멈춰 리더를 넘깁니다. `replicas` 를 명시해 두었으면 엔진이 1 씩
|
|
172
|
+
같이 옮깁니다. `createCluster` 의 브로커 셋 이상 거절(`3+ need stage 3`)은 없어지고 상한이 9 입니다.
|
|
173
|
+
- ☠ **투표권은 COORDS(`coordinator=True`)로만 생깁니다.** 큐 관리자 없는 노드도 COORDS 에 없으면 투표하지 않는 관찰자입니다
|
|
174
|
+
(예전 문법 `COORD[n]` 은 적기만 하면 투표자였습니다). 컨트롤러 전용 노드 표기도 `NODE[n]` 입니다.
|
|
175
|
+
- 투표자인 서비스의 `removeCluster` 는 엔진 7.0.1.3490 부터 거절됩니다 - 먼저 `setCoords` 로 투표권을 거두십시오. 리더가 없는
|
|
176
|
+
잔해를 치울 때는 `removeCluster(name, force=True)` 입니다. 한 서비스가 컨트롤러 자리를 여럿 맡으면
|
|
177
|
+
`joinCluster(..., seats=[n, ..])` 로 정하고, 결과의 `getLocalNodes()` 로 자리를 봅니다.
|
|
178
|
+
- `setClusterProperty` 의 공유 설정(하트비트 · 컨트롤러 타이밍 · `replicas` · `minSync`)은 엔진 7.0.1.3487 부터 어느 서비스에
|
|
179
|
+
보내도 클러스터 전체에 적용됩니다. `getClusterProperty` 로 읽어 고쳐 보내면 그사이 누가 먼저 고쳤을 때
|
|
180
|
+
`MIMQE_CLUSTER_DEF_MOVED` 로 막아 줍니다. `MIMQE_CLUSTER_NOT_COMMITTED` 는 **적용됐는지 모르는 것**이니 다시 읽어 확인하십시오.
|
|
181
|
+
- **팔로워별 복제 상태를 조회합니다**: 새 `ILAdminQmgr.getReplicationStatus()`. 리더 브로커의 큐 관리자에 부르면 확정 ISR
|
|
182
|
+
(`committedIsr`), 지금 적용된 MINSYNC(`minSync`, 미설정이면 `None`), 팔로워마다 상태(`SYNCED` / `SYNCING` / `OUT`) ·
|
|
183
|
+
미ack 건수 · 마지막 ack 뒤 경과 ms 를 돌려줍니다(엔진 7.0.1.3500 이상). 그 전 엔진도 역할과 팔로워별 상태는 주고, 나머지는
|
|
184
|
+
모른다(`None` / `-1`)로 채웁니다. 팔로워별 상태는 리더만 알므로 팔로워에 부르면 목록이 빕니다.
|
|
185
|
+
팔로워의 이 응답(역할 `FOLLOWER`, 빈 목록)은 엔진 7.0.1.3501 부터입니다. 그 전 엔진의 팔로워는
|
|
186
|
+
`MIMQE_FOLLOWER_NODE (leader=...)` 로 거절합니다 - 기존 `getClusterRole()` 도 같아서, 3501 전 팔로워에서는
|
|
187
|
+
`"FOLLOWER"` 대신 이 예외가 납니다.
|
|
188
|
+
- 엔진 7.0.1.3486 부터 **COORDS 없는 클러스터 정의(옛 판사 · 조정자 모델)는 동작하지 않습니다.** `createCluster` 는
|
|
189
|
+
`MIMQE_INVALID_ARGUMENT (COORDS required - ...)`, 이미 저장된 옛 정의의 `startCluster` / `setClusterProperty` 는
|
|
190
|
+
`MIMQE_INVALID_PROPERTY (COORDS required - ...)` 로 거절됩니다. 지우고 COORDS 를 넣어 다시 만드십시오.
|
|
191
|
+
클라이언트는 미리 막지 않습니다(규칙은 엔진이 정본입니다).
|
|
192
|
+
|
|
63
193
|
## 0.17.0 변경 - 클러스터 API 를 컨트롤러 정족수 모델로 (자바 v2.13.0 과 같음, 엔진은 해당 판 이상)
|
|
64
194
|
|
|
65
195
|
판사 · MAIN · SUB 세 정의를 각각 만들던 모델이 **없어졌습니다.** 이제 클러스터 하나에 정의 하나이고, 그 안에 **노드 전부**를 적습니다. 역할은 정의의 종류가 아니라 **노드의 성질**입니다 - 큐 관리자가 있으면 브로커, `coordinator` 를 세우면 컨트롤러이고, 둘은 **겹칠 수 있습니다.**
|
|
@@ -81,8 +211,10 @@ svc.createCluster(c)
|
|
|
81
211
|
- 큐 관리자 없이 투표만 하는 노드를 만들 수 있습니다: `ILClusterNode(None, "10.10.1.15", 0, 9000, node_id=4)`.
|
|
82
212
|
- `getBrokerNodes()` / `getControllerNodes()` / `getNode(n)` / `ILClusterNode.getRoles()` 가 새로 있습니다.
|
|
83
213
|
- **`coordinator` 는 참/거짓이 아니라 세 상태입니다** - `True`(맞다) / `False`(아니다) / `None`(**모름**). `is None` 으로 먼저 가르십시오. `isCoordinator()` 도 세 값을 그대로 줍니다.
|
|
84
|
-
- **`replicas` / `minSync` 는 비워 두는 것이 기본이고, 비운 채로 왕복합니다.** 비우면 엔진이 **브로커 역할 노드 전부**를 복제본 수로 치므로 노드를 더하면 따라 늘어납니다. 숫자를 명시하면 그 진술이 고정되어 노드를 더할 때 같이 고쳐 보내야 합니다.
|
|
85
|
-
-
|
|
214
|
+
- **`replicas` / `minSync` 는 비워 두는 것이 기본이고, 비운 채로 왕복합니다.** 비우면 엔진이 **브로커 역할 노드 전부**를 복제본 수로 치므로 노드를 더하면 따라 늘어납니다. 숫자를 명시하면 그 진술이 고정되어 노드를 더할 때 같이 고쳐 보내야 합니다. **"안 정함" 은 `None` 뿐입니다** - `if not p.replicas` 로 판정하지 마십시오.
|
|
215
|
+
- **`minSync` 는 쓰기를 받는 최소 확정 ISR 수입니다.** 비우면 엔진이 1 로 칩니다 - 혼자 남은 리더도 계속 씁니다(가용성을 택하고 내구성을 내립니다). 엔진 7.0.1.3497 부터 **2 이상을 명시하면 Kafka 의 `min.insync.replicas` 처럼** 확정 ISR 이 그보다 작을 때 쓰기(큐 put · 트랜잭션 commit · 토픽 발행)를 곧바로 `MIMQE_CLUSTER_HALTED (ISR below MINSYNC - writes refused)` 로 거절합니다. 자동커밋 get 과 읽기는 계속됩니다. 그 전 엔진은 값을 저장만 하고 거절하지 않았습니다.
|
|
216
|
+
ALTER 에서 `minSync=None` 은 그대로 두고, **명시한 값을 지우려면 `0` 을 보냅니다**(엔진 7.0.1.3500 부터 미설정으로
|
|
217
|
+
되돌립니다 - 그 전 엔진은 0 을 거절해 한 번 적으면 못 지웠습니다). 읽으면 미설정은 `None` 입니다.
|
|
86
218
|
- **`setClusterProperty` 는 읽어서 고쳐 되보내십시오.** 정의에는 클라이언트가 읽기만 하는 자리(`clusterId` · `signature` · `(defTerm, defVersion)`)가 있고, `getClusterProperty` 로 받은 객체가 그 바이트를 그대로 들고 있습니다. 새로 만든 객체로 ALTER 하면 그 자리가 빈칸으로 나갑니다.
|
|
87
219
|
- **`createCluster` 는 더 이상 클라이언트에서 규칙을 미리 검사하지 않습니다.** 규칙은 엔진이 정본이고, 클라이언트에 한 벌 더 적으면 두 벌이 갈립니다(옛 `TYPE` 사전검사가 그 경로로 생겼습니다).
|
|
88
220
|
- 와이어 레이아웃이 바뀌었습니다 - 고정부 512 → **768**, 노드 256 → **384**(`ILC.MIMQ_VO_CLUSTER_LEN` / `MIMQ_VO_CLUSTER_NODE_LEN`). 블롭 앞머리에 판 표시 `"V2"` 가 붙고, **표시가 없는 옛 블롭은 거절합니다**(길이로는 가릴 수 없습니다 - 옛 512+5+256 과 새 768+5+0 이 둘 다 773 입니다).
|