[英]Unable to deserialize kafka events in NestJs
我在 main 和 controller 文件中有以下配置。 我有一个外部卡夫卡
我在main.ts
中定义了微服务
app.connectMicroservice<MicroserviceOptions>({
transport: Transport.KAFKA,
options: {
client: {
brokers: ['localhost:9092'],
},
consumer: {
groupId: 'consumer-1',
},
},
});
await app.startAllMicroservices();
app.useGlobalPipes(
new ValidationPipe({
transform: true,
}),
);
在controller.ts
export class Controller implements OnModuleInit {
constructor(private readonly service: Service) {}
@Client({
transport: Transport.KAFKA,
options: {
client: {
brokers: ['localhost:9092'],
},
consumer: {
groupId: 'consumer-1',
},
},
})
client: ClientKafka;
async onModuleInit() {
this.client.subscribeToResponseOf('topic-tx');
await this.client.connect();
Logger.log(
'consumer assignments: ' +
JSON.stringify(this.client.getConsumerAssignments()),
);
}
@MessagePattern('topic-tx', Transport.KAFKA)
async handleEntityCreated(@Payload('value') message: IResponseValue) {
console.log('Received event: ', message);
}
来自 kafka 主题的事件作为缓冲区打印在控制台上,并且没有适当地反序列化。
Received event: $da4fa4c3-9e91-43d9-acaa-a07d1fed2635"�
*0x5bcd9e419a11AB71f5eea1a2CFf9B0694C990Baf29*0xDFB50936C5d83b8367BDC01B17c386203AA60368*4611920x0:�0xd3fc98640000000000000000000000005bcd9e419a11ab71f5eea1a2cff9b0694c990baf00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004034346532343639353263666337363430663535306162386233343363633564633865623033303937373534343030343935306134646432393134663864663561B�0xf901261d8082b42794dfb50936c5d83b8367bdc01b17c386203aa6036880b8c4d3fc98640000000000000000000000005bcd9e419a11ab71f5eea1a2cff9b0694c990baf00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000004034346532343639353263666337363430663535306162386233343363633564633865623033303937373534343030343935306134646432393134663864663561820a96a0d524dbe02b8120452b988b0409281e0cf4f7db1ad1dba3c3acfdb11d18c8cc5fa043d1cdea80c15f180854e4de70051cff66f59067ef6a6bbb90156a30285d100eJB0x02dff5ee07b16609c959660789dd743d648a5f44f4ad3651fefe76f7ee004134�legacy*�
B0x02dff5ee07b16609c959660789dd743d648a5f44f4ad3651fefe76f7ee004134B0x362711a341c6e4647f8978a9bb01df8097d9dd9177989389fc17627c66ee1615�%@R�0x00000000000000000000000000000000000000000000008000000000000000000000000000000000000020000000000000000040000000000000000000012000000000000000110000000020000000000000000000000000000000000000000000000000020000000000000000000800000000002000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000020000004000000000000000000000000000000000000000000000200080000000800Z�
*0xDFB50936C5d83b8367BDC01B17c386203AA60368B0xc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62B0x0000000000000000000000005bcd9e419a11ab71f5eea1a2cff9b0694c990bafB0x0000000000000000000000000000000000000000000000000000000000000000B0x0000000000000000000000005bcd9e419a11ab71f5eea1a2cff9b0694c990baf�0x00000000000000000000000000000000000000000000000000000000000000380000000000000000000000000000000000000000000000000000000000000001"7TransferSingle(address,address,address,uint256,uint256)*2
from*0x0000000000000000000000000000000000000000*0
to*0x5bcd9e419a11AB71f5eea1a2CFf9B0694C990Baf*
id56*
value1*6
operator*0x5bcd9e419a11AB71f5eea1a2CFf9B0694C990Baf0�%:B0x02dff5ee07b16609c959660789dd743d648a5f44f4ad3651fefe76f7ee004134JB0x362711a341c6e4647f8978a9bb01df8097d9dd9177989389fc17627c66ee1615Z�
*0xDFB50936C5d83b8367BDC01B17c386203AA60368B0x6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529bB0x0000000000000000000000000000000000000000000000000000000000000038�0x0000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000004034346532343639353263666337363430663535306162386233343363633564633865623033303937373534343030343935306134646432393134663864663561"URI(string,uint256)*I
value@44e246952cfc7640f550ab8b343cc5dc8eb030977544004950a4dd2914f8df5a*
id560�%:B0x02dff5ee07b16609c959660789dd743d648a5f44f4ad3651fefe76f7ee004134JB0x362711a341c6e4647f8978a9bb01df8097d9dd9177989389fc17627c66ee1615P`��h��r0x0�
MetalToken�latest:devB$0afcfd48-c20b-4db7-ab35-73f90e937c37
如何将来自 kafka 代理的传入消息反序列化为适当的接口
我对nestjs kafka客户端代码的探索越多,我就找到了解决问题的方法。 此外,这个https://github.com/nestjs/nest/issues/3726帮助我解决了这个问题。
确切的问题是:在 Kafka 微服务缓冲区中,值总是被字符串化,这会禁止解析为正确的格式。
解决方法是在kafkaconfig中设置解析器选项:keepBinary为true,从而保留缓冲区格式。
{
transport: Transport.KAFKA,
options: {
client: {
brokers: ['localhost:9092'],
},
consumer: {
groupId: 'consumer-1',
},
parser: { keepBinary: true },
},
}
如果您的数据具有自定义格式,您可以设置自定义反序列化器,如下所示:
import { Deserializer } from '@nestjs/microservices';
export class CustomDeserializer implements Deserializer {
public deserialize(data: Buffer): unknown {
const stringifiedData = data.toString();
// do stuff here...
return deserializedData;
}
}
之后,您可以使用以下命令将该反序列化器注入您的微服务中:
app.connectMicroservice<MicroserviceOptions>({
transport: Transport.KAFKA,
options: {
deserializer: new CustomDeserializer();
client: {
brokers: ['localhost:9092'],
},
consumer: {
groupId: 'consumer-1',
},
},
});
await app.startAllMicroservices();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.