@venizia/ignis-docs 0.2.0 → 0.2.1-1
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.
- package/README.md +14 -14
- package/content/best-practices/api-usage-examples.md +39 -19
- package/content/best-practices/architectural-patterns.md +24 -13
- package/content/best-practices/architecture-decisions.md +29 -16
- package/content/best-practices/code-style-standards/advanced-patterns.md +43 -31
- package/content/best-practices/code-style-standards/constants-configuration.md +19 -4
- package/content/best-practices/code-style-standards/control-flow.md +33 -1
- package/content/best-practices/code-style-standards/documentation.md +28 -8
- package/content/best-practices/code-style-standards/function-patterns.md +15 -4
- package/content/best-practices/code-style-standards/index.md +7 -2
- package/content/best-practices/code-style-standards/naming-conventions.md +27 -3
- package/content/best-practices/code-style-standards/route-definitions.md +9 -5
- package/content/best-practices/code-style-standards/tooling.md +14 -1
- package/content/best-practices/code-style-standards/type-safety.md +39 -6
- package/content/best-practices/common-pitfalls.md +59 -35
- package/content/best-practices/contribution-workflow.md +8 -4
- package/content/best-practices/data-modeling.md +78 -62
- package/content/best-practices/deployment-strategies.md +56 -19
- package/content/best-practices/error-handling.md +247 -153
- package/content/best-practices/index.md +6 -0
- package/content/best-practices/performance-optimization.md +26 -13
- package/content/best-practices/security-guidelines.md +35 -9
- package/content/best-practices/testing-strategies.md +7 -2
- package/content/best-practices/troubleshooting-tips.md +27 -17
- package/content/extensions/components/api-reference.md +109 -323
- package/content/extensions/components/authentication/api.md +489 -602
- package/content/extensions/components/authentication/errors.md +135 -498
- package/content/extensions/components/authentication/index.md +89 -801
- package/content/extensions/components/authentication/usage.md +231 -955
- package/content/extensions/components/authorization/api.md +991 -644
- package/content/extensions/components/authorization/errors.md +204 -208
- package/content/extensions/components/authorization/getting-started.md +227 -0
- package/content/extensions/components/authorization/index.md +88 -795
- package/content/extensions/components/authorization/usage.md +219 -528
- package/content/extensions/components/health-check.md +77 -243
- package/content/extensions/components/index.md +24 -90
- package/content/extensions/components/mail/api.md +553 -285
- package/content/extensions/components/mail/errors.md +76 -62
- package/content/extensions/components/mail/index.md +111 -463
- package/content/extensions/components/mail/usage.md +139 -173
- package/content/extensions/components/request-tracker.md +70 -173
- package/content/extensions/components/socket-io/api.md +462 -785
- package/content/extensions/components/socket-io/errors.md +49 -51
- package/content/extensions/components/socket-io/index.md +69 -372
- package/content/extensions/components/socket-io/usage.md +212 -105
- package/content/extensions/components/static-asset/api.md +461 -141
- package/content/extensions/components/static-asset/errors.md +121 -53
- package/content/extensions/components/static-asset/index.md +84 -606
- package/content/extensions/components/static-asset/usage.md +184 -299
- package/content/extensions/components/template/index.md +3 -3
- package/content/extensions/components/websocket/api.md +311 -404
- package/content/extensions/components/websocket/errors.md +47 -56
- package/content/extensions/components/websocket/index.md +75 -407
- package/content/extensions/components/websocket/usage.md +120 -338
- package/content/extensions/helpers/cron/index.md +52 -160
- package/content/extensions/helpers/crypto/index.md +67 -480
- package/content/extensions/helpers/crypto/reference.md +528 -0
- package/content/extensions/helpers/env/index.md +64 -178
- package/content/extensions/helpers/error/index.md +286 -196
- package/content/extensions/helpers/index.md +61 -47
- package/content/extensions/helpers/inversion/index.md +76 -550
- package/content/extensions/helpers/inversion/reference.md +530 -0
- package/content/extensions/helpers/kafka/admin.md +23 -3
- package/content/extensions/helpers/kafka/compile-binary.md +83 -52
- package/content/extensions/helpers/kafka/consumer.md +65 -28
- package/content/extensions/helpers/kafka/examples.md +46 -253
- package/content/extensions/helpers/kafka/index.md +55 -617
- package/content/extensions/helpers/kafka/producer.md +156 -22
- package/content/extensions/helpers/kafka/schema-registry.md +59 -79
- package/content/extensions/helpers/logger/hf-logger.md +220 -0
- package/content/extensions/helpers/logger/index.md +78 -552
- package/content/extensions/helpers/logger/pino.md +105 -0
- package/content/extensions/helpers/logger/reference.md +937 -0
- package/content/extensions/helpers/network/api.md +276 -195
- package/content/extensions/helpers/network/index.md +87 -524
- package/content/extensions/helpers/queue/index.md +80 -897
- package/content/extensions/helpers/queue/reference.md +494 -0
- package/content/extensions/helpers/redis/index.md +86 -640
- package/content/extensions/helpers/redis/reference.md +784 -0
- package/content/extensions/helpers/secrets/index.md +136 -0
- package/content/extensions/helpers/socket-io/api.md +325 -204
- package/content/extensions/helpers/socket-io/index.md +79 -429
- package/content/extensions/helpers/storage/api.md +584 -464
- package/content/extensions/helpers/storage/index.md +80 -573
- package/content/extensions/helpers/types/index.md +75 -495
- package/content/extensions/helpers/types/reference.md +689 -0
- package/content/extensions/helpers/uid/index.md +176 -189
- package/content/extensions/helpers/websocket/api.md +366 -214
- package/content/extensions/helpers/websocket/index.md +68 -503
- package/content/extensions/helpers/worker-thread/index.md +62 -396
- package/content/extensions/helpers/worker-thread/reference.md +428 -0
- package/content/extensions/index.md +38 -39
- package/content/extensions/src-details/mcp-server.md +96 -548
- package/content/guides/core-concepts/persistent/datasources.md +2 -2
- package/content/guides/core-concepts/persistent/index.md +5 -1
- package/content/guides/core-concepts/persistent/models.md +1 -1
- package/content/guides/core-concepts/persistent/pglite.md +218 -0
- package/content/guides/core-concepts/persistent/postgres-drivers.md +21 -15
- package/content/guides/core-concepts/persistent/search-meilisearch.md +22 -12
- package/content/guides/core-concepts/persistent/search-typesense.md +28 -16
- package/content/guides/core-concepts/persistent/sqlite.md +296 -0
- package/content/guides/core-concepts/persistent/transactions.md +12 -11
- package/content/guides/core-concepts/secrets-vault.md +177 -0
- package/content/guides/core-concepts/services.md +1 -1
- package/content/guides/get-started/5-minute-quickstart.md +59 -206
- package/content/guides/get-started/philosophy.md +135 -670
- package/content/guides/get-started/setup.md +53 -74
- package/content/guides/migrations/redis-helpers-migration.md +5 -4
- package/content/guides/migrations/scoped-rbac-migration.md +5 -5
- package/content/guides/migrations/unified-connectors-migration.md +8 -7
- package/content/guides/tutorials/ecommerce-api.md +3 -8
- package/content/guides/tutorials/realtime-chat.md +1 -1
- package/content/references/base/application.md +64 -22
- package/content/references/base/components.md +3 -3
- package/content/references/base/connectors.md +79 -136
- package/content/references/base/controllers.md +12 -12
- package/content/references/base/datasources-reference.md +600 -0
- package/content/references/base/datasources.md +84 -444
- package/content/references/base/dependency-injection.md +25 -46
- package/content/references/base/filter-system/application-usage.md +95 -123
- package/content/references/base/filter-system/array-operators.md +33 -43
- package/content/references/base/filter-system/comparison-operators.md +55 -63
- package/content/references/base/filter-system/default-filter.md +144 -350
- package/content/references/base/filter-system/fields-order-pagination.md +116 -148
- package/content/references/base/filter-system/index.md +114 -253
- package/content/references/base/filter-system/json-filtering.md +52 -181
- package/content/references/base/filter-system/list-operators.md +28 -44
- package/content/references/base/filter-system/logical-operators.md +69 -114
- package/content/references/base/filter-system/null-operators.md +41 -98
- package/content/references/base/filter-system/pattern-matching.md +48 -51
- package/content/references/base/filter-system/quick-reference.md +93 -196
- package/content/references/base/filter-system/range-operators.md +22 -38
- package/content/references/base/filter-system/tips.md +70 -133
- package/content/references/base/filter-system/use-cases.md +173 -232
- package/content/references/base/grpc-controllers.md +53 -17
- package/content/references/base/index.md +5 -3
- package/content/references/base/middlewares.md +43 -28
- package/content/references/base/models-reference.md +886 -0
- package/content/references/base/models.md +81 -1452
- package/content/references/base/providers.md +8 -8
- package/content/references/base/repositories/advanced.md +281 -419
- package/content/references/base/repositories/index.md +84 -644
- package/content/references/base/repositories/mixins.md +25 -21
- package/content/references/base/repositories/relations.md +194 -375
- package/content/references/base/repositories/soft-deletable.md +67 -55
- package/content/references/base/secrets.md +267 -0
- package/content/references/base/services.md +8 -6
- package/content/references/configuration/environment-variables.md +73 -21
- package/content/references/configuration/index.md +51 -31
- package/content/references/index.md +1 -1
- package/content/references/quick-reference.md +3 -16
- package/content/references/utilities/crypto.md +35 -76
- package/content/references/utilities/date.md +33 -73
- package/content/references/utilities/duration.md +85 -0
- package/content/references/utilities/index.md +6 -2
- package/content/references/utilities/jsx-reference.md +298 -0
- package/content/references/utilities/jsx.md +82 -525
- package/content/references/utilities/module.md +81 -61
- package/content/references/utilities/parse.md +34 -64
- package/content/references/utilities/performance.md +33 -58
- package/content/references/utilities/promise.md +28 -62
- package/content/references/utilities/request.md +58 -218
- package/content/references/utilities/retry.md +139 -0
- package/content/references/utilities/schema.md +43 -137
- package/content/references/utilities/statuses-reference.md +361 -0
- package/content/references/utilities/statuses.md +63 -667
- package/dist/mcp-server/index.js +0 -0
- package/dist/mcp-server/tools/github/list-project-files.tool.d.ts +1 -1
- package/dist/mcp-server/tools/github/list-project-files.tool.d.ts.map +1 -1
- package/dist/mcp-server/tools/github/list-project-files.tool.js +3 -3
- package/dist/mcp-server/tools/github/search-code.tool.js +1 -1
- package/dist/mcp-server/tools/github/verify-dependencies.tool.js +1 -1
- package/dist/mcp-server/tools/github/view-source-file.tool.js +1 -1
- package/package.json +24 -23
|
@@ -1,134 +1,17 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
```typescript
|
|
8
|
-
import { KafkaProducerHelper, KafkaAcks } from '@venizia/ignis-helpers/kafka';
|
|
9
|
-
import { stringSerializers } from '@platformatic/kafka';
|
|
10
|
-
|
|
11
|
-
const helper = KafkaProducerHelper.newInstance({
|
|
12
|
-
bootstrapBrokers: ['broker1:9092', 'broker2:9092'],
|
|
13
|
-
clientId: 'interval-producer',
|
|
14
|
-
serializers: stringSerializers,
|
|
15
|
-
acks: KafkaAcks.ALL,
|
|
16
|
-
onBrokerConnect: ({ broker }) => console.log(`Connected to ${broker.host}:${broker.port}`),
|
|
17
|
-
onBrokerDisconnect: ({ broker }) => console.warn(`Disconnected from ${broker.host}`),
|
|
18
|
-
});
|
|
19
|
-
|
|
20
|
-
const producer = helper.getProducer();
|
|
21
|
-
let count = 0;
|
|
22
|
-
|
|
23
|
-
const interval = setInterval(async () => {
|
|
24
|
-
if (!helper.isHealthy()) {
|
|
25
|
-
console.warn('Producer not healthy, skipping...');
|
|
26
|
-
return;
|
|
27
|
-
}
|
|
28
|
-
|
|
29
|
-
await producer.send({
|
|
30
|
-
messages: [{
|
|
31
|
-
topic: 'events',
|
|
32
|
-
key: `key-${count % 3}`,
|
|
33
|
-
value: JSON.stringify({ index: count, timestamp: new Date().toISOString() }),
|
|
34
|
-
}],
|
|
35
|
-
});
|
|
36
|
-
count++;
|
|
37
|
-
}, 100);
|
|
38
|
-
|
|
39
|
-
process.on('SIGINT', async () => {
|
|
40
|
-
clearInterval(interval);
|
|
41
|
-
console.log(`Shutting down... (sent ${count} messages)`);
|
|
42
|
-
await helper.close();
|
|
43
|
-
process.exit(0);
|
|
44
|
-
});
|
|
45
|
-
```
|
|
46
|
-
|
|
47
|
-
## Consumer: Callback-Based with Lag Monitoring
|
|
48
|
-
|
|
49
|
-
```typescript
|
|
50
|
-
import { KafkaConsumerHelper } from '@venizia/ignis-helpers/kafka';
|
|
51
|
-
import { stringDeserializers } from '@platformatic/kafka';
|
|
1
|
+
---
|
|
2
|
+
title: Kafka Examples & Troubleshooting
|
|
3
|
+
description: A multi-topic admin setup script, wiring Kafka helpers into IGNIS IoC, and a common-error lookup table
|
|
4
|
+
difficulty: intermediate
|
|
5
|
+
---
|
|
52
6
|
|
|
53
|
-
|
|
54
|
-
bootstrapBrokers: ['broker1:9092', 'broker2:9092'],
|
|
55
|
-
clientId: 'event-consumer',
|
|
56
|
-
groupId: 'processing-group',
|
|
57
|
-
deserializers: stringDeserializers,
|
|
58
|
-
|
|
59
|
-
onMessage: async ({ message }) => {
|
|
60
|
-
const data = JSON.parse(message.value!);
|
|
61
|
-
console.log(`Processing: ${message.key} -> ${JSON.stringify(data)}`);
|
|
62
|
-
await message.commit();
|
|
63
|
-
},
|
|
64
|
-
onMessageDone: ({ message }) => {
|
|
65
|
-
console.log(`Done: ${message.key}`);
|
|
66
|
-
},
|
|
67
|
-
onMessageError: ({ error, message }) => {
|
|
68
|
-
console.error(`Error processing ${message?.key}:`, error.message);
|
|
69
|
-
},
|
|
70
|
-
|
|
71
|
-
onGroupJoin: ({ groupId, memberId }) => {
|
|
72
|
-
console.log(`Joined group ${groupId} as ${memberId}`);
|
|
73
|
-
},
|
|
74
|
-
onGroupRebalance: ({ groupId }) => {
|
|
75
|
-
console.log(`Rebalance in ${groupId}`);
|
|
76
|
-
},
|
|
77
|
-
|
|
78
|
-
onLag: ({ lag }) => {
|
|
79
|
-
for (const [topic, partitionLags] of lag) {
|
|
80
|
-
partitionLags.forEach((lagValue, partition) => {
|
|
81
|
-
if (lagValue > 1000n) {
|
|
82
|
-
console.warn(`High lag on ${topic}[${partition}]: ${lagValue}`);
|
|
83
|
-
}
|
|
84
|
-
});
|
|
85
|
-
}
|
|
86
|
-
},
|
|
87
|
-
onLagError: ({ error }) => console.error('Lag error:', error),
|
|
88
|
-
});
|
|
89
|
-
|
|
90
|
-
await helper.start({ topics: ['events'] });
|
|
91
|
-
helper.startLagMonitoring({ topics: ['events'], interval: 10_000 });
|
|
92
|
-
|
|
93
|
-
process.on('SIGINT', async () => {
|
|
94
|
-
await helper.close();
|
|
95
|
-
process.exit(0);
|
|
96
|
-
});
|
|
97
|
-
```
|
|
98
|
-
|
|
99
|
-
## Consumer: Direct Stream Access (for-await)
|
|
100
|
-
|
|
101
|
-
```typescript
|
|
102
|
-
import { KafkaConsumerHelper } from '@venizia/ignis-helpers/kafka';
|
|
103
|
-
import { stringDeserializers } from '@platformatic/kafka';
|
|
104
|
-
|
|
105
|
-
const helper = KafkaConsumerHelper.newInstance({
|
|
106
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
107
|
-
clientId: 'stream-consumer',
|
|
108
|
-
groupId: 'stream-group',
|
|
109
|
-
deserializers: stringDeserializers,
|
|
110
|
-
onBrokerConnect: ({ broker }) => console.log(`Connected to ${broker.host}`),
|
|
111
|
-
});
|
|
112
|
-
|
|
113
|
-
// Use the consumer directly for async iterator pattern
|
|
114
|
-
const consumer = helper.getConsumer();
|
|
115
|
-
const stream = await consumer.consume({
|
|
116
|
-
topics: ['orders'],
|
|
117
|
-
mode: 'committed',
|
|
118
|
-
fallbackMode: 'latest',
|
|
119
|
-
});
|
|
120
|
-
|
|
121
|
-
for await (const message of stream) {
|
|
122
|
-
console.log(`${message.topic}[${message.partition}] @${message.offset}: ${message.key} -> ${message.value}`);
|
|
123
|
-
await message.commit();
|
|
124
|
-
}
|
|
7
|
+
# Examples & Troubleshooting
|
|
125
8
|
|
|
126
|
-
|
|
127
|
-
await helper.close();
|
|
128
|
-
```
|
|
9
|
+
Two examples not covered on the reference pages, plus a lookup table for the errors you'll actually hit.
|
|
129
10
|
|
|
130
11
|
## Admin: Topic Setup Script
|
|
131
12
|
|
|
13
|
+
A deploy-time script that creates several topics with production configuration in one call. Run it once, from a `migrate` step or a CI job.
|
|
14
|
+
|
|
132
15
|
```typescript
|
|
133
16
|
import { KafkaAdminHelper } from '@venizia/ignis-helpers/kafka';
|
|
134
17
|
|
|
@@ -141,7 +24,6 @@ async function setupTopics() {
|
|
|
141
24
|
|
|
142
25
|
const admin = helper.getAdmin();
|
|
143
26
|
|
|
144
|
-
// Create topics
|
|
145
27
|
await admin.createTopics({
|
|
146
28
|
topics: ['orders', 'inventory', 'notifications'],
|
|
147
29
|
partitions: 6,
|
|
@@ -152,11 +34,8 @@ async function setupTopics() {
|
|
|
152
34
|
],
|
|
153
35
|
});
|
|
154
36
|
|
|
155
|
-
// Verify
|
|
156
37
|
const topics = await admin.listTopics({ includeInternals: false });
|
|
157
38
|
console.log('Topics:', topics);
|
|
158
|
-
|
|
159
|
-
// Health check
|
|
160
39
|
console.log('Healthy:', helper.isHealthy());
|
|
161
40
|
|
|
162
41
|
await helper.close();
|
|
@@ -165,102 +44,17 @@ async function setupTopics() {
|
|
|
165
44
|
setupTopics();
|
|
166
45
|
```
|
|
167
46
|
|
|
168
|
-
## Exactly-Once: Consume-Transform-Produce
|
|
169
|
-
|
|
170
|
-
```typescript
|
|
171
|
-
import { KafkaProducerHelper, KafkaConsumerHelper } from '@venizia/ignis-helpers/kafka';
|
|
172
|
-
import { stringSerializers, stringDeserializers } from '@platformatic/kafka';
|
|
173
|
-
|
|
174
|
-
const producer = KafkaProducerHelper.newInstance({
|
|
175
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
176
|
-
clientId: 'eos-producer',
|
|
177
|
-
serializers: stringSerializers,
|
|
178
|
-
transactionalId: 'eos-tx',
|
|
179
|
-
idempotent: true,
|
|
180
|
-
});
|
|
181
|
-
|
|
182
|
-
const consumer = KafkaConsumerHelper.newInstance({
|
|
183
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
184
|
-
clientId: 'eos-consumer',
|
|
185
|
-
groupId: 'eos-group',
|
|
186
|
-
deserializers: stringDeserializers,
|
|
187
|
-
autocommit: false,
|
|
188
|
-
|
|
189
|
-
onMessage: async ({ message }) => {
|
|
190
|
-
// Consume-transform-produce within a single transaction
|
|
191
|
-
const transformed = JSON.stringify({
|
|
192
|
-
...JSON.parse(message.value!),
|
|
193
|
-
processedAt: new Date().toISOString(),
|
|
194
|
-
});
|
|
195
|
-
|
|
196
|
-
await producer.runInTransaction(async ({ send, addConsumer, addOffset }) => {
|
|
197
|
-
await addConsumer(consumer.getConsumer());
|
|
198
|
-
await addOffset(message);
|
|
199
|
-
await send({
|
|
200
|
-
messages: [{ topic: 'processed-events', key: message.key, value: transformed }],
|
|
201
|
-
});
|
|
202
|
-
});
|
|
203
|
-
},
|
|
204
|
-
onMessageError: ({ error }) => console.error('Processing error:', error),
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
await consumer.start({ topics: ['raw-events'] });
|
|
208
|
-
```
|
|
209
|
-
|
|
210
|
-
## Schema Registry: Validated Messages
|
|
211
|
-
|
|
212
|
-
```typescript
|
|
213
|
-
import {
|
|
214
|
-
KafkaSchemaRegistryHelper,
|
|
215
|
-
KafkaProducerHelper,
|
|
216
|
-
KafkaConsumerHelper,
|
|
217
|
-
} from '@venizia/ignis-helpers/kafka';
|
|
218
|
-
|
|
219
|
-
const registry = KafkaSchemaRegistryHelper.newInstance({
|
|
220
|
-
url: 'http://localhost:8081',
|
|
221
|
-
});
|
|
222
|
-
|
|
223
|
-
const producer = KafkaProducerHelper.newInstance({
|
|
224
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
225
|
-
clientId: 'schema-producer',
|
|
226
|
-
registry: registry.getRegistry(),
|
|
227
|
-
onBrokerConnect: ({ broker }) => console.log(`Producer connected to ${broker.host}`),
|
|
228
|
-
});
|
|
229
|
-
|
|
230
|
-
// Sends schema-validated objects
|
|
231
|
-
await producer.getProducer().send({
|
|
232
|
-
messages: [{
|
|
233
|
-
topic: 'orders',
|
|
234
|
-
key: 'order-1',
|
|
235
|
-
value: { id: 1, status: 'created', total: 99.99 },
|
|
236
|
-
}],
|
|
237
|
-
});
|
|
238
|
-
|
|
239
|
-
const consumer = KafkaConsumerHelper.newInstance({
|
|
240
|
-
bootstrapBrokers: ['localhost:9092'],
|
|
241
|
-
clientId: 'schema-consumer',
|
|
242
|
-
groupId: 'schema-group',
|
|
243
|
-
registry: registry.getRegistry(),
|
|
244
|
-
onMessage: async ({ message }) => {
|
|
245
|
-
// message.value is auto-deserialized to the schema type
|
|
246
|
-
console.log(message.value.id, message.value.status);
|
|
247
|
-
await message.commit();
|
|
248
|
-
},
|
|
249
|
-
});
|
|
250
|
-
|
|
251
|
-
await consumer.start({ topics: ['orders'] });
|
|
252
|
-
```
|
|
253
|
-
|
|
254
47
|
## Using Helpers with IGNIS IoC
|
|
255
48
|
|
|
49
|
+
Bind each helper once at boot. Inject it wherever you need to publish or consume - the same pattern IGNIS uses for every other connected resource.
|
|
50
|
+
|
|
256
51
|
```typescript
|
|
257
52
|
import {
|
|
258
53
|
KafkaProducerHelper,
|
|
259
54
|
KafkaConsumerHelper,
|
|
260
|
-
KafkaAdminHelper,
|
|
261
55
|
} from '@venizia/ignis-helpers/kafka';
|
|
262
56
|
import { stringSerializers, stringDeserializers } from '@platformatic/kafka';
|
|
263
|
-
import { inject
|
|
57
|
+
import { inject } from '@venizia/ignis-inversion';
|
|
264
58
|
|
|
265
59
|
// Register helpers in the IoC container
|
|
266
60
|
app.bind('kafka.producer').to(
|
|
@@ -286,7 +80,6 @@ app.bind('kafka.consumer').to(
|
|
|
286
80
|
);
|
|
287
81
|
|
|
288
82
|
// Inject into services
|
|
289
|
-
@injectable()
|
|
290
83
|
export class OrderEventService {
|
|
291
84
|
constructor(
|
|
292
85
|
@inject({ key: 'kafka.producer' }) private producer: KafkaProducerHelper,
|
|
@@ -307,24 +100,22 @@ export class OrderEventService {
|
|
|
307
100
|
|
|
308
101
|
## Troubleshooting
|
|
309
102
|
|
|
310
|
-
### Common Issues
|
|
311
|
-
|
|
312
103
|
| Error | Cause | Fix |
|
|
313
104
|
|-------|-------|-----|
|
|
314
|
-
| `ECONNREFUSED localhost:9092` | Broker `advertised.listeners` set to `localhost` but connecting remotely | Set `KAFKA_ADVERTISED_LISTENERS`
|
|
315
|
-
| `Request timed out` | SASL handshake or broker unreachable | Add `connectTimeout: 30_000, requestTimeout: 30_000` |
|
|
316
|
-
| `Connection closed` | Connecting without SASL to a SASL-required listener | Check `KAFKA_LISTENER_SECURITY_PROTOCOL_MAP`
|
|
317
|
-
| `Cannot find a suitable SASL mechanism` | Wrong mechanism
|
|
318
|
-
| `Failed to deserialize a message` |
|
|
319
|
-
| `JSON.stringify cannot serialize BigInt` | `message.offset` and `message.timestamp` are `bigint` | Use custom replacer: `(_k, v) => typeof v === 'bigint' ? v.toString() : v` |
|
|
320
|
-
| Consumer idle
|
|
321
|
-
| `isHealthy()` returns `false` |
|
|
322
|
-
| `isReady()` returns `false` (consumer) | Consumer
|
|
323
|
-
| Graceful shutdown
|
|
105
|
+
| `ECONNREFUSED localhost:9092` | Broker `advertised.listeners` set to `localhost` but you're connecting remotely | Set `KAFKA_ADVERTISED_LISTENERS` to the correct external host IP |
|
|
106
|
+
| `Request timed out` | SASL handshake stalled, or the broker is unreachable | Add `connectTimeout: 30_000, requestTimeout: 30_000` |
|
|
107
|
+
| `Connection closed` | Connecting without SASL to a SASL-required listener | Check `KAFKA_LISTENER_SECURITY_PROTOCOL_MAP` - use `SASL_PLAINTEXT` |
|
|
108
|
+
| `Cannot find a suitable SASL mechanism` | Wrong mechanism, e.g. `PLAIN` when the broker only supports `SCRAM-SHA-512` | Read the error for the supported mechanisms, match `mechanism` to one |
|
|
109
|
+
| `Failed to deserialize a message` | Serializer and deserializer don't match | Match the serde on both sides. For old data, use a new consumer group or recreate the topic |
|
|
110
|
+
| `JSON.stringify cannot serialize BigInt` | `message.offset` and `message.timestamp` are `bigint` | Use a custom replacer: `(_k, v) => typeof v === 'bigint' ? v.toString() : v` |
|
|
111
|
+
| Consumer sits idle, no messages | More consumers than partitions | Make sure `numPartitions >= numConsumers` |
|
|
112
|
+
| `isHealthy()` returns `false` | Every broker disconnected - one idle disconnect alone won't trigger this | Check broker addresses, SASL config, network. `getConnectedBrokerCount()` gives the exact count |
|
|
113
|
+
| `isReady()` returns `false` (consumer) | Consumer isn't active - `start()` was never called, or the stream closed | Call `await helper.start({ topics })` before checking readiness |
|
|
114
|
+
| Graceful shutdown times out | In-flight requests are taking too long | Raise `shutdownTimeout`, or call `close({ isForce: true })` |
|
|
324
115
|
|
|
325
116
|
### Docker Kafka Configuration
|
|
326
117
|
|
|
327
|
-
|
|
118
|
+
Connecting from outside a Dockerized Kafka needs two listeners: one for containers talking to each other, one for the host.
|
|
328
119
|
|
|
329
120
|
```yaml
|
|
330
121
|
environment:
|
|
@@ -338,24 +129,26 @@ environment:
|
|
|
338
129
|
CONTROLLER:PLAINTEXT
|
|
339
130
|
```
|
|
340
131
|
|
|
341
|
-
|
|
342
|
-
|
|
343
|
-
|
|
344
|
-
|
|
345
|
-
|
|
346
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
359
|
-
|
|
360
|
-
|
|
361
|
-
|
|
132
|
+
| Listener | Used for |
|
|
133
|
+
|---|---|
|
|
134
|
+
| `INTERNAL` | Inter-broker communication |
|
|
135
|
+
| `EXTERNAL` | Client connections from outside Docker |
|
|
136
|
+
| `CONTROLLER` | KRaft controller communication |
|
|
137
|
+
|
|
138
|
+
## See also
|
|
139
|
+
|
|
140
|
+
- [Kafka Overview](./) - the four helpers, shared health/close API, and the compile-binary caveat
|
|
141
|
+
- [Producer](./producer) - connection & SASL setup, serialization, compression, transactions
|
|
142
|
+
- [Consumer](./consumer) - message callbacks, automatic reconnect, lag monitoring
|
|
143
|
+
- [Admin](./admin) - topic, group, offset, ACL, and quota management
|
|
144
|
+
- [Schema Registry](./schema-registry) - schema-validated serialization
|
|
145
|
+
- [Compiling to a Single Binary](./compile-binary) - required if any example on this page ships inside a `bun build --compile` binary
|
|
146
|
+
- [Queue Helpers](../queue/) - BullMQ, MQTT, and the in-memory queue
|
|
147
|
+
- [Redis Helper](../redis/) - Redis connection management
|
|
148
|
+
|
|
149
|
+
**Files:**
|
|
150
|
+
|
|
151
|
+
- [`packages/helpers/src/modules/queue/kafka/producer.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/queue/kafka/producer.ts) - `KafkaProducerHelper`
|
|
152
|
+
- [`packages/helpers/src/modules/queue/kafka/consumer.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/queue/kafka/consumer.ts) - `KafkaConsumerHelper`
|
|
153
|
+
- [`packages/helpers/src/modules/queue/kafka/admin.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/queue/kafka/admin.ts) - `KafkaAdminHelper`
|
|
154
|
+
- [`packages/helpers/src/modules/queue/kafka/index.ts`](https://github.com/VENIZIA-AI/ignis/blob/main/packages/helpers/src/modules/queue/kafka/index.ts) - the `/kafka` sub-path barrel
|