1

I am trying to create microservice architecture where I have api-gateway and register-service microservice.Every request is handeled by api-gateway after getting user registered I want to send response back.I have set everything up but in api-gateway its showing error like this:

ERROR [ClientKafka] ERROR [Connection] Response Metadata(key: 3, version: 6) 
{"timestamp":"2022-04-16T07:44:29.289Z","logger":"kafkajs","broker":"example-server-eu1- 
kafka.upstash.io:9092","clientId":"register_user-client","error":"This server does not host 
this topic-partition","correlationId":4,"size":250}

Broker url is dummy for security purposes.

Below is my code:

api-gateway/app.module.ts

import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { ClientsModule, Transport } from '@nestjs/microservices';
import { AppController } from './app.controller';
import { AppService } from './app.service';

  @Module({
  imports: [
         ConfigModule.forRoot(),
         ClientsModule.register([
          {
           name: 'REGISTER_SERVICE',
           transport: Transport.KAFKA,
           options:{
             client:{
               clientId: 'register_user',
               brokers: [process.env.KAFKA_BROKER],
               sasl: {
                mechanism: 'scram-sha-256',
                username: process.env.KAFKA_USERNAME,
                password: process.env.KAFKA_PASSWORD,
              },
              ssl: true,
             },
             consumer:{
               groupId: 'register-consumer'
             }
           }
         }
        ])
       ],
  controllers: [AppController],
  providers: [AppService],
})
export class AppModule {}

api-gateway/app.controller.ts

import { Body, Controller, Get, Inject, OnModuleInit, Post } from '@nestjs/common';
import { ClientKafka } from '@nestjs/microservices';
import { AppService } from './app.service';
import { UserDto } from './dto/user.dto';

@Controller('api')
export class AppController implements OnModuleInit {
  constructor(private readonly appService: AppService,
          @Inject('REGISTER_SERVICE') private clientKafka:ClientKafka) {}

async onModuleInit(){
  this.clientKafka.subscribeToResponseOf('ADD_USER');
  await this.clientKafka.connect();
}

@Post('register')
 getResponse(@Body() userDto:UserDto){
  return this.appService.getResponse(userDto);
 }          
}

api-gateway/app.service.ts

import { Inject, Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { UserDto } from './dto/user.dto';
import { Model } from 'mongoose';
import { ClientKafka } from '@nestjs/microservices';

@Injectable()
export class AppService {
  constructor(@Inject('REGISTER_SERVICE') private clientKafka:ClientKafka){}

async getResponse(userDto:UserDto){
 return this.clientKafka.send('ADD_USER',userDto);
 }
}

register-service/main.ts

import { NestFactory } from '@nestjs/core';
import { MicroserviceOptions, Transport } from '@nestjs/microservices';
import { AppModule } from './app.module';

async function bootstrap() {

const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
 transport: Transport.KAFKA,
  options: {
    client: {
      brokers: [process.env.KAFKA_BROKER],
      sasl: {
        mechanism: 'scram-sha-256',
        username: process.env.KAFKA_USERNAME,
        password: process.env.KAFKA_PASSWORD,
      },
      ssl: true,
     },
    consumer:{
    groupId: 'register-consumer'
   }
  }
});
app.listen();
}
bootstrap();

register-service/app.controller.ts

import { Controller, Get } from '@nestjs/common';
import { EventPattern, MessagePattern } from '@nestjs/microservices';
import { AppService } from './app.service';

@Controller()
export class AppController {
 constructor(private readonly appService: AppService) {}

@MessagePattern('ADD_USER')
handleRegistration(data){
  return this.appService.handleRegistration(data.value);
 }
}

register-service/app.service.ts

import { Injectable } from '@nestjs/common';
import { InjectModel } from '@nestjs/mongoose';
import { User } from './schema/user.schema';
import { Model } from 'mongoose';

@Injectable()
export class AppService {
 constructor(@InjectModel('User') private readonly userModel:Model<User>){}

async handleRegistration(data){
 console.log(data);
 const dataSave = await new this.userModel(data).save();
 console.log(dataSave);
 return "User registered successfully";
 }
}


        
OneCricketeer
  • 179,855
  • 19
  • 132
  • 245
Digvijay
  • 2,887
  • 3
  • 36
  • 86
  • Have you tried contacting upstash support? Looks like the error might be on their end – OneCricketeer Apr 16 '22 at 12:46
  • Did you check my code is it look fine to you. – Digvijay Apr 16 '22 at 12:50
  • Without knowing how the security settings of your kafka broker are setup, I can't answer that. For instance, you've set ssl as true, yet not defined any ssl certificates – OneCricketeer Apr 16 '22 at 12:55
  • I using upstash kafka seever and did not vhange security setting its all by default and I will make ssl false. – Digvijay Apr 16 '22 at 16:29
  • Can you plz tell me how to setup request /response pattern using rabbit Mq or is ot support this pattern like kafka – Digvijay Apr 16 '22 at 16:30
  • 1
    Have you created a topic with name `ADD_USER` ? – enesness Apr 17 '22 at 06:56
  • Like I said, Upstash should be able to support you using their own systems. You've not shown us that this topic should exist, like the error says it does not... Kafka is asynchronous. So is RabbitMQ. Neither really support request/response patterns. You might want to do more research into CQRS or other message-based design patterns – OneCricketeer Apr 17 '22 at 15:28

0 Answers0