Microservices không connect được với nhau

Chào mọi người, em đang tìm hiểu về Microservice dùng MQTT. Em mắc lỗi đó là bên transaction emit mà bên notification không nhận được, không biết có thiếu sót chỗ nào không. Em mới tìm hiểu nên dùng thuật ngữ không đúng, mong mọi người thông cảm

Đây là module tracsaction


image

Đây là module notification
image
image

Đây là MQTT server

Chỗ nào gọi hàm ở dòng 16 ảnh thứ nhất vậy cậu?
Với cả, cậu copy code dưới dạng text lên đây được không?

4 Likes

Dạ em đang làm chức năng tạo transaction, sau khi tạo thành công sẽ truyền transaction vừa tạo xuống cho thằng đó á anh. Tại em làm hoài k ra em vừa xoá code rồi, em tính mai research lại thử xem.
Mà tạm thời xem hình thì anh có thể đoán nó bị vấn đề gì không ạ. Ở broker server thì em nhận được message mà nó publish rồi. Còn thằng kia subscribe thì k được. K biết em có có sai đoạn nào k. Em cảm ơn anh nhé

Ohm, cậu có thể thấy cậu đã loại trừ được một vấn đề có thể xảy ra rồi :smile:

Nếu được, cậu có thể cung cấp log được không? Chí ít chúng ta có một số kỳ vọng thế này:

  • Cậu nên thấy log ở sự kiện on client được show 2 lần. Điều này có nghĩa là 2 clients đã kết nối thành công tới broker.
  • Cậu nên thấy log ở sự kiện on publish, với message đúng. Điều này có nghĩa là publisher hoạt động.
  • Cậu nên thấy log ở sự kiện on subscribe. Điều này có nghĩa là subscriber hoạt động.

Cậu cũng có thể bắt cả sự kiện clientDisconnect và log lại để loại trừ TH mất kết nối.

Tớ không phải chuyên gia về mqtt, nên tớ không có phỏng đoán gì. Tớ chỉ có practice khi tìm lỗi, là cậu cần giới hạn phạm vi lỗi nhỏ nhất có thể, bằng cách loại trừ dần các khả năng có thể xảy ra.

4 Likes

Dạ trưa em có log ra là:

  • ở connect thì có log 2 thằng connect
  • ở publish thì có publish mà dòng 17 hình 1 emit
  • còn subscribe em có log được, nhưng mà ở dòng 17, em thêm .subscribe thì mới log ra được, còn ở module notification em k biết làm sao để subscribe topic hết.

Em search hết mà k tìm được kết quả mong muốn

Uhm, tớ có thể thấy vấn đề nằm ở việc setup cho subscriber ở module notification. Cậu thử gọi lại với .subscribe xem? Chí ít việc log subscriber xuất hiện ở broker chứng minh việc subscription đã diễn ra thành công.
Publisher của cậu đã hoạt động, giờ cậu chỉ cần kiểm tra cách kết nối từ subscriber thôi. Cậu thử điều tra thêm xung quanh vùng đó nhé!

3 Likes

dạ, em cảm ơn anh nhé. Để em check lại bước này, mà em thắc mắc 1 chỗ là:

  • Client A - publish -> Broker <---- Client B -subscribe cái client A vừa publish. Hay là
  • Client A - publish -> Broker subscribe - publish xuống cho client B <— Client B subscribe cái Broke publish

Em vẫn hơi thắc mắc. Mong anh giải thích giúp em với :smiley:

Client A - publish -> Broker <---- Client B -subscribe cái client A vừa publish.

Ý này đúng cậu ạ :smile:
“Cái” client A vừa publish được gọi là “message”. Client B (subscriber) phải subscribe đúng topic mà client A (publisher) publish message vào.

Hope it helps!

4 Likes

dạ cảm ơn anh, em hiểu rồi :laughing:

dạ em vẫn chưa tìm ra nghiên nhân. Sau đây là code của em

Khi em tạo transaction thành công thì em sẽ gọi thằng này

import { Inject, Injectable } from '@nestjs/common'
import { ClientProxy } from '@nestjs/microservices'

@Injectable()
export class MqttActionService {
	constructor(
		@Inject('TRANSACTION_SERVICE')
		private readonly client: ClientProxy
	) {
		this.client.connect()
	}

	async publishMessageToMqttServer(): Promise<void> {
		this.client.send({ cmd: 'new_transaction' }, 'Hello world').subscribe()
	}
}

@Module({
	imports: [
		...typeOrmModules,
		HttpModule,
		AppConfigModule,
		ClientsModule.register([
			{
				name: 'TRANSACTION_SERVICE',
				transport: Transport.MQTT,
				options: {
					url: 'mqtt://localhost:1883'
				}
			}
		])
	],
	providers: services,
	exports: services
})
export class ActionsModule {}

Broker

const aedes = require("aedes")();
const server = require("net").createServer(aedes.handle);
const port = 1883;

aedes.on("client", (client) => {
  console.log("Client connected");
});

aedes.on("publish", function (packet, client) {
  if (client) {
    console.log(
      `MESSAGE_PUBLISHED : MQTT Client ${
        client ? client.id : "AEDES BROKER_" + aedes.id
      } has published message "${packet.payload}" on ${
        packet.topic
      } to aedes broker ${aedes.id}`
    );
  }
});

aedes.on("subscribe", function (subscriptions, client) {
  console.log(
    `TOPIC_SUBSCRIBED : MQTT Client ${
      client ? client.id : client
    } subscribed to topic: ${subscriptions
      .map((s) => s.topic)
      .join(",")} on aedes broker ${aedes.id}`
  );
});

server.listen(port, function () {
  console.log("server started and listening on port ", port);
});

Notification Module

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

@Controller()
export class AppController {
	constructor(
		@Inject('NOTIFICATION_SERVICE')
		private readonly client: ClientProxy,
		private readonly appService: AppService
	) {
		this.client.connect()
	}

	@Get()
	getHello(): string {
		return this.appService.getHello()
	}

	@MessagePattern({ cmd: 'new_transaction' })
	test(@Payload() data: string) {
		return `Hello bro ${data}`
	}
}

import { Module } from '@nestjs/common'
import { ClientsModule, Transport } from '@nestjs/microservices'

import { AppController } from './app.controller'
import { AppService } from './app.service'

@Module({
	imports: [
		ClientsModule.register([
			{
				name: 'NOTIFICATION_SERVICE',
				transport: Transport.MQTT,
				options: {
					url: 'mqtt://localhost:1883'
				}
			}
		])
	],
	controllers: [AppController],
	providers: [AppService]
})
export class AppModule {}

Khi em start Broker lên và tạo transaction

server started and listening on port  1883
Client connected
MESSAGE_PUBLISHED : MQTT Client mqttjs_fa50b9af has published message "{"pattern":{"cmd":"new_transaction"},"data":"Hello world","id":"66a8a368-fa67-419b-8fae-556880dc7ba3"}" on {"cmd":"new_transaction"} to aedes broker 7a19aefe-3c44-48fd-96fd-7cf812d474ef
Client connected
TOPIC_SUBSCRIBED : MQTT Client mqttjs_fa50b9af subscribed to topic: {"cmd":"new_transaction"}/reply on aedes broker 7a19aefe-3c44-48fd-96fd-7cf812d474ef

Note: Nếu dùng .subscribe ở function publishMessageToMqttServer thì sẽ log ra subscribe như ở trên ạ

1 Like

Hình như cậu gửi sai tên topic convention rồi.
Thử tham khảo link này để hiểu thêm về topic convention và thử đặt tên lại topic nha :smile:

Nếu vẫn lỗi, cậu show log lỗi mới giúp tớ nha :smile:

EDIT:
Từ log của cậu, có thể thấy instance publisher cũng là subscriber luôn (check client ID). Cậu có lẽ nên log thêm client ID ở đoạn client connect để làm rõ luôn.
Log của cậu cũng cho thấy, instance publish vào topic {"cmd":"new_transaction"}, nhưng lại subscribe ở topic {"cmd":"new_transaction"}/reply.

Cậu nên làm theo đúng topic naming convention, để ít nhất loại đi mấy lỗi linh tinh liên quan tới topic. Nếu vấn đề vẫn còn (khả năng là vẫn còn), chúng ta phân tích tiếp log mới.

3 Likes

Dạ, em đang thắc mắc 1 chỗ là subscribe bằng .subscribe hay là dùng MessagePattern(). Em vẫn chưa hiểu chỗ này.

Oh, đó là 2 cách để cài đặt thôi cậu.
Tớ nghĩ cả 2 cách đều nên chạy. Cậu thử đọc doc và xem tutorial liên quan xem? :smile:

2 Likes

dạ em đã fix được. Em sai ở chỗ không khai báo thằng này, em cảm ơn anh nhiều :smiley:

const app = await NestFactory.createMicroservice<MicroserviceOptions>(AppModule, {
  transport: Transport.MQTT,
  options: {
    url: 'mqtt://localhost:1883',
  },
});
1 Like
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?