jetstream-api 0.7.0__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 (26) hide show
  1. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/PKG-INFO +14 -2
  2. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/README.md +13 -1
  3. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/__init__.py +1 -1
  4. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/producer.py +50 -27
  5. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/qmgr.py +6 -3
  6. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/jetstream_api.egg-info/PKG-INFO +14 -2
  7. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/pyproject.toml +1 -1
  8. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/LICENSE.txt +0 -0
  9. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/admin.py +0 -0
  10. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/admintopic.py +0 -0
  11. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/common.py +0 -0
  12. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/connectivity.py +0 -0
  13. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/exception.py +0 -0
  14. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/msg.py +0 -0
  15. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/partitioner.py +0 -0
  16. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/pattern.py +0 -0
  17. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/properties.py +0 -0
  18. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/py.typed +0 -0
  19. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/topic.py +0 -0
  20. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/ilink/util.py +0 -0
  21. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/jetstream_api.egg-info/SOURCES.txt +0 -0
  22. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/jetstream_api.egg-info/dependency_links.txt +0 -0
  23. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/jetstream_api.egg-info/requires.txt +0 -0
  24. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/jetstream_api.egg-info/top_level.txt +0 -0
  25. {jetstream_api-0.7.0 → jetstream_api-0.7.1}/setup.cfg +0 -0
  26. {jetstream_api-0.7.0 → 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.7.0
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,17 @@ 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
+
57
68
  ## 0.7.0 변경 - 발행 v2: producer 하나 = 토픽 하나, 파티션별 배치, 봉투 겹쳐 보내기 (엔진 v2 필요)
58
69
 
59
70
  발행 경로를 엔진의 새 발행 형식(v2)으로 바꿨습니다. **엔진도 v2 판이어야 합니다** - 옛 엔진에는 발행이 되지 않고
@@ -61,7 +72,8 @@ pip install jetstream-api
61
72
 
62
73
  - **producer 하나 = 토픽 하나 = 연결 하나.** `qmgr.create_producer("ORDER.EVENT", config)` 로 만듭니다. 생성할 때 토픽의
63
74
  파티션 수를 받아 두므로 없는 토픽이면 생성 단계에서 `MIMQE_OBJECT_NOT_FOUND` 로 실패합니다. 토픽이 여러 개면 토픽마다
64
- producer 를 만들고, 연결이 더 필요하면 producer 를 더 만듭니다(예: 발행 스레드마다 하나).
75
+ producer 를 만듭니다. 한 토픽의 producer(연결)는 1~4개면 충분합니다 - 엔진 7.0.1.3407 실측에서 8개로 늘리면 어느 크기든
76
+ 오히려 줄었습니다. 큰 레코드(1KB 급)는 1개로도 디스크가 먼저 한계에 닿고, 작은 레코드(100B 급)는 4개 근처가 최대입니다.
65
77
  - 레코드 토픽이 producer 토픽과 다르면 `send()` 가 `MIMQE_INVALID_ARGUMENT` 로 거부합니다.
66
78
  - 옛 `create_producer(config)` / `ILTopicProducer(host, port, name, config)` 모양으로 부르면 `TypeError` 가 납니다.
67
79
  - 배치는 **파티션마다** 모입니다. `batchSize`(기본 **262144**, 자바와 같음)는 파티션 배치 하나의 상한입니다. 보낼 때는
@@ -8,6 +8,17 @@ 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
+
11
22
  ## 0.7.0 변경 - 발행 v2: producer 하나 = 토픽 하나, 파티션별 배치, 봉투 겹쳐 보내기 (엔진 v2 필요)
12
23
 
13
24
  발행 경로를 엔진의 새 발행 형식(v2)으로 바꿨습니다. **엔진도 v2 판이어야 합니다** - 옛 엔진에는 발행이 되지 않고
@@ -15,7 +26,8 @@ pip install jetstream-api
15
26
 
16
27
  - **producer 하나 = 토픽 하나 = 연결 하나.** `qmgr.create_producer("ORDER.EVENT", config)` 로 만듭니다. 생성할 때 토픽의
17
28
  파티션 수를 받아 두므로 없는 토픽이면 생성 단계에서 `MIMQE_OBJECT_NOT_FOUND` 로 실패합니다. 토픽이 여러 개면 토픽마다
18
- producer 를 만들고, 연결이 더 필요하면 producer 를 더 만듭니다(예: 발행 스레드마다 하나).
29
+ producer 를 만듭니다. 한 토픽의 producer(연결)는 1~4개면 충분합니다 - 엔진 7.0.1.3407 실측에서 8개로 늘리면 어느 크기든
30
+ 오히려 줄었습니다. 큰 레코드(1KB 급)는 1개로도 디스크가 먼저 한계에 닿고, 작은 레코드(100B 급)는 4개 근처가 최대입니다.
19
31
  - 레코드 토픽이 producer 토픽과 다르면 `send()` 가 `MIMQE_INVALID_ARGUMENT` 로 거부합니다.
20
32
  - 옛 `create_producer(config)` / `ILTopicProducer(host, port, name, config)` 모양으로 부르면 `TypeError` 가 납니다.
21
33
  - 배치는 **파티션마다** 모입니다. `batchSize`(기본 **262144**, 자바와 같음)는 파티션 배치 하나의 상한입니다. 보낼 때는
@@ -1,6 +1,6 @@
1
1
  """iLink - Python client API for iLink M.O.M. (Message Oriented Middleware)."""
2
2
 
3
- __version__ = "0.7.0"
3
+ __version__ = "0.7.1"
4
4
 
5
5
  # --- Admin / Service ---
6
6
  from .admin import ILAdminService, ILAdminQmgr, ILLogBrowser, ILQueueBrowser
@@ -58,8 +58,9 @@ class ILProducerConfig:
58
58
  self._acks = 1
59
59
  #: 배치를 모으는 시간(ms). 0 이면 모이는 대로 즉시 보낸다
60
60
  self._lingerMs = 0
61
- #: 파티션 배치 하나의 크기 상한(바이트). 0.7.0 부터 자바와 같은 262144(사용자 결정)
62
- self._batchSize = 262144
61
+ # 0.7.1: Kafka batch.size 와 같은 16384(사용자 결정 2026-09-13). 0.7.0 은 262144 였다
62
+ #: 파티션 배치 하나의 크기 상한(바이트). 기본 16384
63
+ self._batchSize = 16384
63
64
  #: 동시에 ACK 를 기다릴 봉투 수 상한
64
65
  self._maxInFlight = 5
65
66
  #: 연결 실패 시 재시도 횟수
@@ -78,14 +79,20 @@ class ILProducerConfig:
78
79
  self._maxRequestSize = 1048576
79
80
  #: 접속한 큐관리자가 받는 프레임 길이 상한(바이트) - 엔진 Runtime@MaxFrameLength 기본 128MiB
80
81
  self._maxFrameLength = ILC.MIMQ_DEFAULT_MAX_FRAME_LENGTH
81
- #: 멱등 발행(PID 발급 + 시퀀스). 재전송 시 중복 적재를 막는다
82
- self._enableIdempotence = False
82
+ # 0.7.1: Kafka 3.x 와 같은 기본 켜짐(사용자 결정 2026-09-13)
83
+ #: 멱등 발행(PID 발급 + 시퀀스). 재전송 시 중복 적재를 막는다. 기본 켜짐
84
+ self._enableIdempotence = True
85
+ #: 멱등을 사용자가 정했는지. 정하지 않았으면 acks=0 이나 maxInFlight > 5 에서 저절로 꺼진다
86
+ self._idempotenceSet = False
83
87
 
84
88
  def __setattr__(self, name: str, value) -> None:
85
89
  # 구버전 호환: cfg.acks = 0 / cfg.lingerMs = 5 같은 직접 대입을 내부 슬롯으로 돌린다.
86
90
  # (예전 이름 idempotent 도 함께 받아 준다)
87
91
  if name == "idempotent":
88
92
  name = "enableIdempotence"
93
+ if name == "enableIdempotence":
94
+ # 직접 대입도 사용자가 정한 것이다 - 기본 멱등의 저절로 끄기를 적용하지 않는다
95
+ object.__setattr__(self, "_idempotenceSet", True)
89
96
  if name in self._OPTIONS:
90
97
  name = "_" + name
91
98
  object.__setattr__(self, name, value)
@@ -104,7 +111,8 @@ class ILProducerConfig:
104
111
  ILProducerConfig: 체이닝을 위해 자기 자신.
105
112
 
106
113
  Note:
107
- ``acks=0`` 은 멱등 발행과 함께 쓸 수 없다 (:meth:`validate` 가 거부).
114
+ 멱등(기본 켜짐)을 정하지 않았으면 ``acks=0`` 은 멱등을 끈다. ``enableIdempotence(True)`` 를
115
+ 명시하고 ``acks=0`` 이면 :meth:`validate` 가 거부한다.
108
116
  """
109
117
  self._acks = 0 if n == 0 else 1; return self
110
118
 
@@ -127,7 +135,7 @@ class ILProducerConfig:
127
135
  self._lingerMs = max(0, n); return self
128
136
 
129
137
  def batchSize(self, n: int) -> "ILProducerConfig":
130
- """파티션 배치 하나의 크기 상한(바이트)을 정한다. (기본 262144 = 256KB)
138
+ """파티션 배치 하나의 크기 상한(바이트)을 정한다. (기본 16384 = 16KB)
131
139
 
132
140
  Args:
133
141
  n (int): 상한(**바이트**). 배치는 파티션마다 따로 모인다. 레코드를 붙이면 이 값을
@@ -137,7 +145,7 @@ class ILProducerConfig:
137
145
  ILProducerConfig: 체이닝을 위해 자기 자신.
138
146
 
139
147
  Note:
140
- 뜻과 기본값이 Java 클라이언트와 같다(0.7.0).
148
+ 뜻과 기본값이 Java 클라이언트와 같다(0.7.1 부터 16384. 0.7.0 은 262144 였다 - 처리량이 모자라면 늘린다).
141
149
  ``lingerMs`` 가 0 이면 자르는 크기로만 쓰이고(배치는 보낼 수 있게 되는 즉시 나간다),
142
150
  ``lingerMs`` 가 0 보다 크면 전송 조건도 된다(이만큼 차거나 lingerMs 가 지나면 보낸다).
143
151
  레코드 하나가 이 값보다 크면 그 레코드 혼자 배치 하나가 된다. 보낼 때는 준비된
@@ -156,9 +164,9 @@ class ILProducerConfig:
156
164
 
157
165
  Note:
158
166
  I/O 스레드가 봉투를 이만큼 겹쳐 보낸다(0.7.0). 엔진은 한 연결의 봉투를 겹쳐
159
- 처리하고 응답은 요청 순서대로 온다. **enableIdempotence 를 켜면 5 이하여야 한다** -
160
- 엔진이 파티션마다 최근 배치 5개로 중복을 가리기 때문이다(넘으면 :meth:`validate` 가
161
- ``ValueError``).
167
+ 처리하고 응답은 요청 순서대로 온다. **멱등(기본 켜짐)은 5 이하에서만 쓰인다** -
168
+ 엔진이 파티션마다 최근 배치 5개로 중복을 가리기 때문이다. 멱등을 정하지 않았으면 5 를 넘길 때
169
+ 멱등이 꺼지고, ``enableIdempotence(True)`` 를 명시했으면 :meth:`validate` 가 ``ValueError``.
162
170
  """
163
171
  self._maxInFlight = max(1, n); return self
164
172
 
@@ -310,23 +318,33 @@ class ILProducerConfig:
310
318
  return self
311
319
 
312
320
  def enableIdempotence(self, b: bool) -> "ILProducerConfig":
313
- """멱등 발행(중복 제거)을 켠다. (기본 False)
321
+ """멱등 발행(중복 제거)을 켜거나 끈다. (기본 켜짐 - 0.7.1)
314
322
 
315
323
  켜면 접속 시 서버에서 PID 를 발급받아 파티션 배치마다 (PID, baseSeq) 를 실어 보낸다.
316
324
  재시도로 같은 배치가 두 번 도착해도 서버가 시퀀스로 걸러 **한 번만 적재한다.**
317
325
  ``maxInFlight`` 는 5 이하여야 한다.
318
326
 
327
+ 이 메서드로 정하지 않으면 ``acks=0`` 이거나 ``maxInFlight`` 가 5 를 넘을 때 멱등이 저절로 꺼진다.
328
+ 명시적으로 켜고 그 둘과 함께 쓰면 :meth:`validate` 가 거부한다.
329
+
330
+ 멱등이면 토픽 FLUSH / epoch 변경으로 거절된 배치(``MIMQE_TOPIC_FLUSHED`` /
331
+ ``MIMQE_TOPIC_EPOCH_MISMATCH``)를 다시 보내지 않고 실패로 올린다 - 엔진이 그 토픽의 번호 상태를
332
+ 새로 잡으므로 다시 보낸 배치가 중복으로 가려져 사라질 수 있기 때문이다. 비멱등(False)은 메타데이터를
333
+ 다시 받고 조용히 다시 보낸다.
334
+
319
335
  Args:
320
- b (bool): True 면 멱등 발행.
336
+ b (bool): True 면 멱등 발행, False 면 비멱등.
321
337
 
322
338
  Returns:
323
339
  ILProducerConfig: 체이닝을 위해 자기 자신.
324
340
 
325
341
  Raises:
326
- ValueError: (:meth:`validate` 시점) ``acks=0`` 과 함께 켰을 때.
342
+ ValueError: (:meth:`validate` 시점) 명시적으로 켜고 ``acks=0`` 이나 ``maxInFlight`` > 5 와 함께 썼을 때.
327
343
  응답을 받지 않는 모드에서는 중복 제거가 성립하지 않는다.
328
344
  """
329
- self._enableIdempotence = bool(b); return self
345
+ self._enableIdempotence = bool(b)
346
+ self._idempotenceSet = True
347
+ return self
330
348
 
331
349
  # ── 빌더 (snake 별칭) ───────────────────────────────────────────────
332
350
  # Java 이름 빌더와 동작이 같다. 상세 설명은 각 원본 메서드를 참조.
@@ -404,18 +422,18 @@ class ILProducerConfig:
404
422
  return self._lingerMs
405
423
 
406
424
  def get_batch_size(self) -> int:
407
- """한 봉투 누적 한도(바이트). 기본 16384.
425
+ """파티션 배치 하나의 크기 상한(바이트). 기본 16384.
408
426
 
409
427
  Returns:
410
- int: 한 봉투 누적 한도(바이트). 기본 16384.
428
+ int: 파티션 배치 하나의 크기 상한(바이트). 기본 16384.
411
429
  """
412
430
  return self._batchSize
413
431
 
414
432
  def get_max_in_flight(self) -> int:
415
- """동시 in-flight 배치 상한. 기본 5 (파이썬 구현은 실제로 항상 1).
433
+ """응답을 기다리는 봉투 수의 상한. 기본 5.
416
434
 
417
435
  Returns:
418
- int: 동시 in-flight 배치 상한. 기본 5 (파이썬 구현은 실제로 항상 1).
436
+ int: 응답을 기다리는 봉투 수의 상한. 기본 5.
419
437
  """
420
438
  return self._maxInFlight
421
439
 
@@ -484,12 +502,15 @@ class ILProducerConfig:
484
502
  return self._maxFrameLength
485
503
 
486
504
  def is_idempotence_enabled(self) -> bool:
487
- """멱등 발행이 켜져 있는지. 기본 False.
505
+ """실제로 쓰일 멱등 발행 여부. 기본 True.
488
506
 
489
507
  Returns:
490
- bool: 멱등 발행이 켜져 있는지. 기본 False.
508
+ bool: 멱등 발행 여부. 정하지 않았으면 기본(True)이되, ``acks=0`` 이거나 ``maxInFlight`` 가
509
+ 5 를 넘으면 False 다.
491
510
  """
492
- return self._enableIdempotence
511
+ if self._idempotenceSet:
512
+ return self._enableIdempotence
513
+ return self._acks != 0 and self._maxInFlight <= 5
493
514
 
494
515
  getAcks = get_acks
495
516
  getLingerMs = get_linger_ms
@@ -507,12 +528,13 @@ class ILProducerConfig:
507
528
 
508
529
  def validate(self) -> None:
509
530
  """조합 검증. producer 생성 시 호출된다."""
510
- if self._enableIdempotence and self._acks == 0:
531
+ # 0.7.1: 명시적으로 켰을 때만 막는다. 정하지 않은 기본 멱등은 is_idempotence_enabled() 에서 저절로 꺼진다
532
+ if self._idempotenceSet and self._enableIdempotence and self._acks == 0:
511
533
  raise ValueError(
512
534
  "enableIdempotence requires acks=1"
513
535
  )
514
536
  # 0.7.0: 엔진은 (pid, 파티션)마다 최근 배치 5개로 중복을 가린다 - 그보다 많이 겹쳐 보내면 재전송이 중복으로 가려지지 않는다
515
- if self._enableIdempotence and self._maxInFlight > 5:
537
+ if self._idempotenceSet and self._enableIdempotence and self._maxInFlight > 5:
516
538
  raise ValueError(
517
539
  "enableIdempotence requires maxInFlight <= 5 (the engine remembers the last 5 batches"
518
540
  " per partition; Kafka has the same limit)"
@@ -1001,8 +1023,9 @@ class ILTopicProducer:
1001
1023
  """토픽 하나에 묶인 발행자. ``ILQmgr.create_producer(topic, config)`` 로 얻는다. (0.7.0 발행 v2)
1002
1024
 
1003
1025
  producer 하나 = 토픽 하나 = 전용 연결 하나(clientName + ``"-PRD"``) + I/O 스레드 하나다. 생성할 때
1004
- 연결을 열고 토픽의 파티션 수·epoch·세그먼트 크기를 받아 둔다. 연결이 여러 개 필요하면 producer 를
1005
- 여러 개 만든다(예: 발행 스레드마다 하나).
1026
+ 연결을 열고 토픽의 파티션 수·epoch·세그먼트 크기를 받아 둔다. 한 토픽의 producer(연결)는 1~4개면
1027
+ 충분하다 - 엔진 7.0.1.3407 실측에서 8개로 늘리면 어느 크기든 오히려 줄었다. 큰 레코드(1KB 급)는 1개로도
1028
+ 디스크가 먼저 한계에 닿고, 작은 레코드(100B 급)는 4개 근처가 최대다.
1006
1029
 
1007
1030
  보장:
1008
1031
 
@@ -1041,8 +1064,8 @@ class ILTopicProducer:
1041
1064
  Raises:
1042
1065
  TypeError: ``topic`` 이 토픽 이름(str)이 아닐 때 - 0.6.x 의
1043
1066
  ``ILTopicProducer(host, port, name, config)`` 모양으로 부르면 여기서 멈춘다.
1044
- ValueError: ``topic`` 이 비었거나 ``config`` 조합이 잘못됐을 때(멱등 + ``acks=0``,
1045
- 멱등 + ``maxInFlight`` > 5).
1067
+ ValueError: ``topic`` 이 비었거나 ``config`` 조합이 잘못됐을 때(명시적으로 켠 멱등 + ``acks=0``,
1068
+ 명시적으로 켠 멱등 + ``maxInFlight`` > 5).
1046
1069
  ILOperationException: 주소 목록이 비었거나, 접속·토픽 조회를 거절당했을 때
1047
1070
  (없는 토픽이면 ``MIMQE_OBJECT_NOT_FOUND``).
1048
1071
  ILException: 후보 주소 어디에도 접속하지 못했을 때.
@@ -1139,7 +1139,7 @@ class ILQmgr:
1139
1139
  Args:
1140
1140
  topic (str): 발행할 토픽 이름. 이 producer 는 이 토픽에만 발행한다.
1141
1141
  config (ILProducerConfig | None): 발행 설정. 기본 None 이면 전 항목
1142
- 기본값(acks=1 / linger 0 / batch 256KB / maxInFlight 5 / 멱등 꺼짐).
1142
+ 기본값(acks=1 / linger 0 / batch 16KB / maxInFlight 5 / 멱등 켜짐).
1143
1143
 
1144
1144
  Returns:
1145
1145
  ILTopicProducer: 발행자. 다 쓰면 ``close()`` 로 닫는다.
@@ -1149,13 +1149,16 @@ class ILQmgr:
1149
1149
  부르면 여기서 멈춘다.
1150
1150
  ILOperationException: 아직 :meth:`connect` 하지 않았을 때, 없는 토픽일 때
1151
1151
  (``MIMQE_OBJECT_NOT_FOUND``).
1152
- ValueError: ``config`` 조합이 잘못됐을 때(멱등 + ``acks=0``, 멱등 + ``maxInFlight`` > 5).
1152
+ ValueError: ``config`` 조합이 잘못됐을 때(명시적으로 켠 멱등 + ``acks=0``, 명시적으로 켠 멱등 +
1153
+ ``maxInFlight`` > 5).
1153
1154
  ILException: 발행 전용 연결을 맺지 못했을 때.
1154
1155
 
1155
1156
  Note:
1156
1157
  발행자는 **전용 연결**을 하나 연다(클라이언트 이름 뒤에 ``"-PRD"`` 가 붙는다). 생성할 때 토픽의
1157
1158
  파티션 수를 받아 두고, I/O 스레드가 봉투를 겹쳐 보낸다. 토픽이 여러 개면 토픽마다 producer 를
1158
- 만들고, 연결이 더 필요하면 producer 를 더 만든다(예: 발행 스레드마다 하나).
1159
+ 만든다. 한 토픽의 producer 는 1~4개면 충분하다 - 엔진 7.0.1.3407 실측에서 8개로 늘리면 어느 크기든
1160
+ 오히려 줄었다. 큰 레코드(1KB 급)는 1개로도 디스크가 먼저 한계에 닿고, 작은 레코드(100B 급)는 4개
1161
+ 근처가 최대다.
1159
1162
 
1160
1163
  Example::
1161
1164
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: jetstream-api
3
- Version: 0.7.0
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,17 @@ 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
+
57
68
  ## 0.7.0 변경 - 발행 v2: producer 하나 = 토픽 하나, 파티션별 배치, 봉투 겹쳐 보내기 (엔진 v2 필요)
58
69
 
59
70
  발행 경로를 엔진의 새 발행 형식(v2)으로 바꿨습니다. **엔진도 v2 판이어야 합니다** - 옛 엔진에는 발행이 되지 않고
@@ -61,7 +72,8 @@ pip install jetstream-api
61
72
 
62
73
  - **producer 하나 = 토픽 하나 = 연결 하나.** `qmgr.create_producer("ORDER.EVENT", config)` 로 만듭니다. 생성할 때 토픽의
63
74
  파티션 수를 받아 두므로 없는 토픽이면 생성 단계에서 `MIMQE_OBJECT_NOT_FOUND` 로 실패합니다. 토픽이 여러 개면 토픽마다
64
- producer 를 만들고, 연결이 더 필요하면 producer 를 더 만듭니다(예: 발행 스레드마다 하나).
75
+ producer 를 만듭니다. 한 토픽의 producer(연결)는 1~4개면 충분합니다 - 엔진 7.0.1.3407 실측에서 8개로 늘리면 어느 크기든
76
+ 오히려 줄었습니다. 큰 레코드(1KB 급)는 1개로도 디스크가 먼저 한계에 닿고, 작은 레코드(100B 급)는 4개 근처가 최대입니다.
65
77
  - 레코드 토픽이 producer 토픽과 다르면 `send()` 가 `MIMQE_INVALID_ARGUMENT` 로 거부합니다.
66
78
  - 옛 `create_producer(config)` / `ILTopicProducer(host, port, name, config)` 모양으로 부르면 `TypeError` 가 납니다.
67
79
  - 배치는 **파티션마다** 모입니다. `batchSize`(기본 **262144**, 자바와 같음)는 파티션 배치 하나의 상한입니다. 보낼 때는
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "jetstream-api"
7
- version = "0.7.0"
7
+ version = "0.7.1"
8
8
  description = "Python client API for iLink M.O.M. (Message Oriented Middleware)"
9
9
  authors = [{name = "snowjeans"}]
10
10
  readme = "README.md"
File without changes
File without changes