簡體   English   中英

無法使用 nestjs 消費 kafka 事件

[英]fail to consume kafka events with nestjs

我想使用 Kafka 消息,因此我首先調用了emit()消息,它成功地將消息存儲在 Kafka 中。

我可以通過運行批處理文件看到: bin/windows/kafka-console-consumer.bat --topic signals --from-beginning --bootstrap-server localhost:9092

並記錄新消息。 {“botId”:“TKS”,“emailToken”:“38fhsf29h”,“pair”:“xy”,“size”:100}

這是我的 nodejs/nestjs 服務文件。 我的腳本中缺少什么——因為同一個腳本成功寫入了 Kafka? 我試過@MessagePattern@EventPattern來使用消息。 有任何想法嗎?

import { Injectable, OnModuleInit } from '@nestjs/common';
import { TVSignal } from './tvsignal';
import { Client, ClientKafka, EventPattern, MessagePattern, Payload, Transport } from "@nestjs/microservices";
import { Logger } from '@nestjs/common';
import { EventEmitter2 } from '@nestjs/event-emitter';

@Injectable()
export class AppService implements OnModuleInit {

  constructor(private eventEmitter: EventEmitter2) {}

  @Client({
    transport: Transport.KAFKA,
    options: {
      client: {
        clientId: 'trading-signal-receiver',
        brokers: ['localhost:9092'],
      },
      consumer: {
        groupId: 'signals',
        allowAutoTopicCreation: true
      },
      producer: {
      }
    }
  })
  kafkaClient: ClientKafka;


  async onModuleInit() {
    this.kafkaClient.subscribeToResponseOf('signals');
    await this.kafkaClient.connect();
    Logger.log("consumer assignments: " + JSON.stringify(this.kafkaClient.getConsumerAssignments()))

  }
  
  // DOES NOT WORK
  @EventPattern('signals')
  async handleEntityCreated(payload: any) {
    Logger.log("RECEIVED NEW: "+ JSON.stringify(payload));
  }

  getTradingSignals(): string {
    return ""
  }

  // DOES NOT WORK
  @MessagePattern('signals') // Our topic name
  getMessage(@Payload() message) {
    Logger.log("RECEIVED KAFKA MSG" + message.value);
    return 'Hello World';
  }


    // WORKS
    storeSignal(signal: TVSignal){
    Logger.log("STORED: " + JSON.stringify(signal))  
    Logger.log("consumer assignments: " + JSON.stringify(this.kafkaClient.getConsumerAssignments()))
    // send message to OnEvent
    this.eventEmitter.emit('signal.saved', signal);
    // store obj in kafka
    return this.kafkaClient.emit('signals', signal); // args - topic, message
    
  }

  

}

我無法使用它們的原因是因為我錯過了調用app.startAllMicroservices() (KAFKA 是其中之一)。

import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';
import { microserviceConfig} from "./msKafkaConfig";

async function bootstrap() {
  const app = await NestFactory.create(AppModule);
  app.enableCors();   
  app.connectMicroservice(microserviceConfig);
  await app.startAllMicroservices();
  
  await app.listen(3000);



}
bootstrap();

這是您可以附加到應用程序實例中的連接的KafkaOptions 基本上我們將消費者的配置設置為微服務。

import { Transport, KafkaOptions } from '@nestjs/microservices';

const {
  streaming_kafka_msk_notification_bootstrap_brokers: brokerNotification,
} = process.env;

export const KAFKA = {
  topic: process.env.streaming_kafka_msk_notification_topic_name,
  broker: process.env.streaming_kafka_msk_notification_bootstrap_brokers,
};

export const microServiceKafka: KafkaOptions = {
  transport: Transport.KAFKA,
  options: {
    consumer: {
      groupId: 'notifications-ms',
    },
    client: {
      brokers: brokerNotification.split(','),
    },
    subscribe: {
      fromBeginning: true,
    },
  },
};

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM