import uuidfrom kafka import KafkaConsumer,TopicPartition,OffsetAndMetadataconsumer = KafkaConsumer(# cls kafkaプロトコルで消費するコンソールで提供されるトピック名です。例えばXXXXXX-633a268c-XXXX-4a4c-XXXX-7a9a1a7baXXXXは、コンソールでコピーできます。お客様の消費トピック、group_id = 'お客様のコンシューマーグループ名'、auto_offset_reset='earliest',# サービスアドレス+ポート。外部ネットワークポートは9096、内部ネットワークポートは9095です。例は内部ネットワークでの消費です。お客様の実際の状況に応じて入力してください。bootstrap_servers = ['kafkaconsumer-${region}.cls.tencentyun.com:9095'],security_protocol = "SASL_PLAINTEXT",sasl_mechanism = 'PLAIN',# ユーザー名はログセットIDです。例えばca5cXXXXdd2e-4ac0af12-92d4b677d2c6です。sasl_plain_username = "${logsetID}",# パスワードはユーザーのSecretId#SecretKeyを組み合わせた文字列です。例えばAKID********************************#XXXXuXtymIXT0Lacです。#を失わないように注意してください。サブアカウントキーの使用を推奨します。メインアカウントがサブアカウントに権限を付与する際は、最小権限の原則に従います。つまり、サブアカウントのアクセスポリシーにおけるaction、resourceをすべて最小範囲に設定し、操作を満たせば十分です。sasl_plain_password = "${SecretId}#${SecretKey}",api_version = (0,10,1))print('begin')for message in consumer:print('begins')print ("Topic:[%s] Partition:[%d] Offset:[%d] Value:[%s]" % (message.topic, message.partition, message.offset, message.value))print('end')
from kafka import KafkaConsumerimport threadingTOPIC_NAME = 'お客様の消費トピック'GROUP_ID = 'お客様のコンシューマーグループ名'# サービスアドレス+ポート。外部ネットワークポートは9096、内部ネットワークポートは9095です。例は内部ネットワークでの消費です。お客様の実際の状況に応じて入力してください。BOOTSTRAP_SERVERS = ''kafkaconsumer-${region}.cls.tencentyun.com:9095''def consume_messages(thread_id):# Kafkaコンシューマーインスタンスを作成します。consumer = KafkaConsumer(TOPIC_NAME,group_id=GROUP_ID,bootstrap_servers=BOOTSTRAP_SERVERS,value_deserializer=lambda m: m.decode('utf-8'),auto_offset_reset='earliest',security_protocol = "SASL_PLAINTEXT",sasl_mechanism = 'PLAIN',sasl_plain_username = "${logsetID}",sasl_plain_password = "${SecretId}#${SecretKey}",api_version = (2, 5, 1))try:for message in consumer:print(f"Thread {thread_id}: partition = {message.partition}, offset = {message.offset}, value = {message.value}")except KeyboardInterrupt:passfinally:# コンシューマーを閉じます。consumer.close()if __name__ == "__main__":# 3つのコンシューマースレッドを起動します。これは例です。お客様の実際の状況に応じて設定してください。num_consumers = 3threads = []for i in range(num_consumers):thread = threading.Thread(target=consume_messages, args=(i,))threads.append(thread)thread.start()# すべてのスレッドが終了するのを待ちます。for thread in threads:thread.join()
${SecretId}#${SecretKey}の後に(; セミコロン)があります。漏れずに入力してください。そうしないとエラーが発生します。<dependency><groupId>org.apache.kafka</groupId><artifactId>kafka-clients</artifactId><version>2.5.0</version></dependency>import org.apache.kafka.clients.consumer.ConsumerRecord;import org.apache.kafka.clients.consumer.ConsumerRecords;import org.apache.kafka.clients.consumer.KafkaConsumer;import java.time.Duration;import java.util.Collections;import java.util.Properties;public class KafkaConsumerGroupTest {public static void consume() {Properties props = new Properties();String logset_id = "${logsetID}";// CLSコンソールのkafkaプロトコル消費ページに表示されるトピック名String topic_id = "お客様の消費トピック";String accessKeyID = System.getenv("${SecretId}");String accessKeySecret = System.getenv("${SecretKey}");String groupId = "お客様のコンシューマーグループ名";// サービスアドレス+ポート。外部ネットワークポートは9096、内部ネットワークポートは9095です。例は内部ネットワークでの消費です。お客様の実際の状況に応じて入力してください。String hosts = "kafkaconsumer-${region}.cls.tencentyun.com:9095";props.put("bootstrap.servers", hosts);props.put("security.protocol", "SASL_PLAINTEXT");props.put("sasl.mechanism", "PLAIN");props.put("sasl.jaas.config","org.apache.kafka.common.security.plain.PlainLoginModule required username=\\"" +logset_id + "\\" password=\\"" + accessKeyID + "#" + accessKeySecret + "\\";");// Kafkaコンシューマー設定props.put("group.id", groupId);props.put("enable.auto.commit", "true");props.put("auto.commit.interval.ms", "5000");props.put("session.timeout.ms", "10000");props.put("auto.offset.reset", "earliest");props.put("max.poll.interval.ms", "120000");props.put("heartbeat.interval.ms", "3000");props.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");props.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");// Kafkaコンシューマーインスタンスを作成します。KafkaConsumer<String,String> consumer = new KafkaConsumer<String,String>(props);consumer.subscribe(Collections.singletonList(topic_id));while(true) {ConsumerRecords<String, String> records = consumer.poll(Duration.ofSeconds(10000));for (ConsumerRecord<String, String> record : records) {System.out.println("Received message: (" + record.key() + ", " + record.value() + ") at offset " + record.offset());}}}public static void main(String[] args){consume();}}
${SecretId}#${SecretKey}の後に(; セミコロン)があります。漏れずに入力してください。そうしないとエラーが発生します。package mainimport ("context""fmt""github.com/Shopify/sarama""log""os""os/signal""syscall")func main() {// Saramaコンシューマー設定を作成します。//TOPIC_NAMEはお客様の消費トピックです。コンソールで確認してください。topicName := "${TOPIC_NAME}"//GROUP_ID はお客様のコンシューマーグループ名です。groupID := "${GROUP_ID}"//BOOTSTRAP_SERVERSは消費サービスアドレス+ポートです。外部ネットワークポートは9096、内部ネットワークポートは9095です。例えば、kafkaconsumer-${region}.cls.tencentyun.com:9095です。endpoint := "${BOOTSTRAP_SERVERS"config := sarama.NewConfig()config.Net.SASL.Enable = trueconfig.Net.SASL.User = "${logsetID}"config.Net.SASL.Password = "${SecretId}#${SecretKey}"config.Net.SASL.Mechanism = sarama.SASLTypePlaintextconfig.Consumer.Group.Rebalance.Strategy = sarama.BalanceStrategyRoundRobinconfig.Version = sarama.V1_1_1_0config.Consumer.Offsets.Initial = sarama.OffsetNewest// Saramaコンシューマーを作成します。sarama.Logger = log.New(os.Stdout, "[Sarama] ", log.LstdFlags)consumer, err := sarama.NewConsumerGroup([]string{endpoint}, groupID, config)if err != nil {log.Fatal(err)}defer consumer.Close()// 受信したメッセージを処理します。handler := &ConsumerGroupHandler{}signals := make(chan os.Signal, 1)signal.Notify(signals, syscall.SIGINT, syscall.SIGTERM)go func() {for {err := consumer.Consume(context.Background(), []string{topicName}, handler)if err != nil {log.Fatal(err)}if handler.ready {break}}}()<-signalsfmt.Println("Exiting...")}// ConsumerGroupHandlerはsarama.ConsumerGroupHandlerインターフェースを実装しています。type ConsumerGroupHandler struct {ready bool}// Setupはコンシューマーグループの起動前に呼び出されます。func (h *ConsumerGroupHandler) Setup(sarama.ConsumerGroupSession) error {h.ready = truereturn nil}// Cleanupはコンシューマーグループの停止後に呼び出されます。func (h *ConsumerGroupHandler) Cleanup(sarama.ConsumerGroupSession) error {h.ready = falsereturn nil}// ConsumeClaimはClaim内のメッセージを消費します。func (h *ConsumerGroupHandler) ConsumeClaim(session sarama.ConsumerGroupSession, claim sarama.ConsumerGroupClaim) error {for message := range claim.Messages() {fmt.Printf("Received message: %s\\n", string(message.Value))session.MarkMessage(message, "")}return nil}
フィードバック