Las instancias de ApsaraMQ for Kafka en una red privada virtual (VPC) exponen un endpoint predeterminado para la comunicación en texto plano. Utilice este endpoint para conectar un cliente Java y enviar o recibir mensajes sin configurar certificados SSL ni credenciales SASL.
Solo los recursos desplegados en la misma VPC que su instancia de ApsaraMQ for Kafka pueden acceder al endpoint predeterminado.
Para el acceso cifrado o con autenticación, utilice el endpoint SSL o el endpoint SASL en su lugar.
Requisitos previos
Antes de empezar, asegúrese de contar con lo siguiente:
Una instancia de ApsaraMQ for Kafka con un topic y un grupo de consumidores ya creados. Consulte Step 3: Create resources
JDK 1.8 o posterior instalado. Consulte Java Downloads
Maven 2.5 o posterior instalado. Consulte Downloading Apache Maven
Un IDE o editor de texto (este tutorial utiliza IntelliJ IDEA)
Configuración del proyecto de demostración
Descargue el proyecto aliware-kafka-demos desde GitHub y descomprima el paquete.
Abra la carpeta
kafka-java-demoen IntelliJ IDEA o en el IDE de su preferencia. El proyecto incluye clases auxiliares comoJavaKafkaConfigurer, que carga las propiedades de conexión desdekafka.properties.
Incorporación de dependencias de Java
Compruebe que las siguientes dependencias estén presentes en pom.xml. Si no lo están, agréguelas:
<dependency>
<groupId>org.apache.kafka</groupId>
<artifactId>kafka-clients</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.6</version>
</dependency>
Haga coincidir la versión de kafka-clients con la versión principal de su instancia de ApsaraMQ for Kafka. Revise la versión principal en la página Instance Details de la consola de ApsaraMQ for Kafka.
Configuración de las propiedades de conexión
Abra kafka.properties en el proyecto de demostración y establezca los siguientes parámetros:
bootstrap.servers=<your-default-endpoint>
topic=<your-topic-name>
group.id=<your-group-id>
|
Parámetro |
Descripción |
Dónde encontrarlo |
|
|
El endpoint predeterminado de su instancia |
Sección Endpoint Information en la página Instance Details |
|
|
El nombre del topic |
Página Topics |
|
|
El ID del grupo de consumidores |
Página Groups |
Todos los valores están disponibles en la consola de ApsaraMQ for Kafka.
group.id es obligatorio solo para los consumidores. Los productores no lo necesitan.
Envío de mensajes
Compile y ejecute KafkaProducerDemo.java para conectarse al endpoint predeterminado y enviar mensajes al topic especificado.
El siguiente código de ejemplo envía 100 mensajes:
import java.util.ArrayList;
import java.util.List;
import java.util.Properties;
import java.util.concurrent.Future;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.clients.producer.RecordMetadata;
public class KafkaProducerDemo {
public static void main(String[] args) {
// Load kafka.properties from the demo project.
Properties kafkaProperties = JavaKafkaConfigurer.getKafkaProperties();
Properties props = new Properties();
// Default endpoint (bootstrap.servers from kafka.properties).
props.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG,
kafkaProperties.getProperty("bootstrap.servers"));
// Serialize both keys and values as strings.
props.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.StringSerializer");
props.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG,
"org.apache.kafka.common.serialization.StringSerializer");
// Maximum wait time for a request: 30 seconds.
props.put(ProducerConfig.MAX_BLOCK_MS_CONFIG, 30 * 1000);
// Retry up to 5 times on transient failures, with a 3-second backoff.
props.put(ProducerConfig.RETRIES_CONFIG, 5);
props.put(ProducerConfig.RETRY_BACKOFF_MS_CONFIG, 3000);
// Create a thread-safe producer.
// One producer per process is sufficient. For higher throughput, use up to five.
KafkaProducer<String, String> producer = new KafkaProducer<>(props);
String topic = kafkaProperties.getProperty("topic");
try {
List<Future<RecordMetadata>> futures = new ArrayList<>(128);
for (int i = 0; i < 100; i++) {
ProducerRecord<String, String> record =
new ProducerRecord<>(topic, "message value: " + i);
futures.add(producer.send(record));
}
producer.flush();
for (Future<RecordMetadata> future : futures) {
try {
RecordMetadata metadata = future.get();
System.out.println("Produce ok: " + metadata.toString());
} catch (Throwable t) {
t.printStackTrace();
}
}
} catch (Exception e) {
// Troubleshoot if messages still fail after retries.
System.out.println("Failed to send messages.");
e.printStackTrace();
}
}
}
Comprobación de la salida del productor
Tras una ejecución exitosa, la consola imprime una línea Produce ok por cada mensaje, con el topic, la partición y el offset:
Produce ok: <your-topic>-0@15
Recepción de mensajes
El proyecto de demostración incluye ejemplos de consumidores que se suscriben a un topic mediante el endpoint predeterminado. Hay dos enfoques de suscripción disponibles:
|
Enfoque |
Descripción |
Cuándo utilizarlo |
|
Suscripción por topic |
El protocolo del grupo de consumidores asigna las particiones automáticamente |
En la mayoría de los escenarios. Admite el reequilibrio automático cuando los consumidores se unen al grupo o lo abandonan |
|
Asignación de particiones específicas |
Asigna manualmente una o más particiones al consumidor |
Cuando necesita un control detallado sobre qué particiones lee un consumidor |
El proyecto de demostración proporciona ejemplos de consumidores para ambos enfoques de suscripción. Consulte los archivos de origen en la carpeta kafka-java-demo para ver el código completo del consumidor.
Para ejemplos de código de consumidor en otros lenguajes, consulte SDK overview.
Solución de problemas
Si ocurren errores durante la conexión o la entrega de mensajes, consulte What do I do if an error is reported on a client when I use ApsaraMQ for Kafka?