kafka-producer-js
Version:
A configurable Kafka producer package for Node.js applications with NFL event examples and AWS MSK integration
262 lines (202 loc) • 6.5 kB
Markdown
# vi-kafka-producer
A configurable Kafka producer package for Node.js applications with NFL event examples and AWS MSK integration. This package provides an easy-to-use interface for sending messages to Apache Kafka with support for authentication, SSL, batching, and multiple topics.
## Features
- 🚀 Easy to use API with Promise support
- 🔧 Configurable connection settings with environment variables
- 🔐 Support for SASL authentication and SSL
- 📦 Batch message sending
- 🎯 Multiple topics support in single operation
- ⚡ High-performance message production
- 🛡️ Built-in error handling and retry logic
- 📊 Connection status monitoring
- 🎛️ Customizable producer settings
- 🏈 NFL event examples with real-world data structures
- ☁️ AWS MSK cluster integration ready
## Installation
```bash
npm install kafka-producer-js
```
## Requirements
- Node.js >= 14.0.0
- Apache Kafka cluster (local or AWS MSK)
- dotenv package for environment configuration
## Quick Start
### Basic Usage
```javascript
const { createConnectedProducer } = require('kafka-producer-js');
async function sendMessage() {
// Configuration
const config = {
brokers: ['localhost:9092'],
clientId: 'my-app'
};
try {
// Create and connect producer
const producer = await createConnectedProducer(config);
// Send a message
await producer.send('my-topic', {
key: 'user-123',
value: {
userId: 123,
action: 'login',
timestamp: Date.now()
}
});
// Disconnect when done
await producer.disconnect();
console.log('Message sent successfully!');
} catch (error) {
console.error('Error:', error.message);
}
}
sendMessage();
```
### Environment Variable Configuration
Create a `.env` file in your project root:
```bash
KAFKA_BROKERS=your-broker:9092
KAFKA_CLIENT_ID=your-app
KAFKA_LOG_LEVEL=info
```
```javascript
require('dotenv').config();
const config = {
brokers: process.env.KAFKA_BROKERS?.split(',') || ['localhost:9092'],
clientId: process.env.KAFKA_CLIENT_ID || 'default-client',
logLevel: process.env.KAFKA_LOG_LEVEL || 'info'
};
```
## NFL Event Examples
The package includes comprehensive examples with real NFL event data structures:
### User Connection Event
```javascript
const userEvent = {
key: 'user-175551803607995',
value: {
event: 'user_connected',
user_id: 175551803607995,
source: 'NFL',
timestamp: new Date().toISOString(),
connection: {
user_id: 175551973627120,
source: 'NFL'
}
},
headers: {
source: 'NFL',
version: '1.0'
}
};
```
### Batch Events
```javascript
const batchEvents = [
{
key: 'user-175551803607995',
value: {
event: 'user_connected',
user_id: 175551803607995,
source: 'NFL',
timestamp: new Date().toISOString()
}
},
{
key: 'user-175551803607996',
value: {
event: 'user_disconnected',
user_id: 175551803607996,
source: 'NFL',
timestamp: new Date().toISOString(),
session_duration: 1800
}
}
];
```
## Testing and Examples
The package includes comprehensive examples and validation scripts:
### Basic Usage Examples
Run the basic functionality examples (requires Kafka cluster):
```bash
npm run basic
# or
node examples/basic-usage.js
```
### Advanced Configuration Examples
Test advanced features and configurations:
```bash
npm run advanced
# or
node examples/advanced-usage.js
```
### Run All Examples
Execute all examples in sequence:
```bash
npm run examples
```
### Example Files
- **`examples/basic-usage.js`** - Core functionality demonstration
- **`examples/advanced-usage.js`** - Advanced configuration examples
## Configuration
### Basic Configuration
```javascript
const config = {
brokers: ['broker1:9092', 'broker2:9092'], // Required: Array of broker addresses
clientId: 'my-app', // Optional: Client identifier
logLevel: 'warn', // Optional: error, warn, info, debug
connectionTimeout: 3000, // Optional: Connection timeout in ms
requestTimeout: 30000, // Optional: Request timeout in ms
retry: { // Optional: Retry configuration
initialRetryTime: 100,
retries: 8
}
};
```
### AWS MSK Configuration
```javascript
const config = {
brokers: [
'b-1.your-cluster.region.amazonaws.com:9094',
'b-2.your-cluster.region.amazonaws.com:9094'
],
clientId: 'aws-msk-producer',
logLevel: 'info'
};
```
## API Reference
### createConnectedProducer(config)
Creates a producer instance and automatically initializes and connects it.
**Parameters:**
- `config` (Object): Kafka configuration object
**Returns:** Promise<KafkaProducer>
### KafkaProducer Methods
#### send(topic, message)
Sends a single message to a topic.
#### sendBatch(topic, messages)
Sends multiple messages to a single topic.
#### sendToMultipleTopics(topicMessages)
Sends messages to multiple topics in a single operation.
#### disconnect()
Disconnects from the Kafka cluster.
#### isProducerConnected()
Checks if the producer is connected.
## Environment Variables
| Variable | Description | Default |
|----------|-------------|---------|
| `KAFKA_BROKERS` | Comma-separated broker addresses | `localhost:9092` |
| `KAFKA_CLIENT_ID` | Client identifier | `vi-kafka-producer` |
| `KAFKA_LOG_LEVEL` | Log level | `info` |
| `KAFKA_RETRY_INITIAL_TIME` | Initial retry delay (ms) | `100` |
| `KAFKA_RETRY_COUNT` | Maximum retry attempts | `3` |
## Best Practices
1. **Environment Configuration**: Use `.env` files for configuration
2. **Connection Management**: Reuse producer instances
3. **Batch Processing**: Use `sendBatch()` for multiple messages
4. **Error Handling**: Implement proper error handling and retry logic
5. **Graceful Shutdown**: Disconnect producers before application shutdown
6. **Monitoring**: Check connection status using `isProducerConnected()`
## License
MIT
## Contributing
Contributions are welcome! Please feel free to submit a Pull Request.
## Support
If you encounter any issues or have questions, please file an issue on the GitHub repository.