Предположим, у нас есть простая nginx конфигурация для nchan pub / sub:
upstream redis_upstream {
nchan_redis_server "redis://redis";
}
server {
listen 80;
listen [::]:80;
root /var/www/html;
index index.html index.htm index.nginx-debian.html;
server_name localhost;
nchan_storage_engine "redis";
nchan_message_buffer_length 100;
nchan_message_timeout 5m;
location = /sub {
nchan_subscriber;
nchan_channel_id $arg_campaignId;
nchan_redis_pass redis_upstream;
nchan_use_redis on;
}
location = /pub {
nchan_publisher;
nchan_channel_id $arg_campaignId;
nchan_redis_pass redis_upstream;
nchan_use_redis on;
}
location / {
try_files $uri $uri/ =404;
}
}
Эта конфигурация работает хорошо, но она не подходит моему проекту. У меня есть сообщение publi sh logi c в приложении nodejs, поэтому звоните nginx каждый раз, когда мне нужно отправить сообщение sh подписчикам, что крайне неудобно. Однако есть способ опубликовать sh сообщения с помощью команды PUBLISH
redis, но nchan использует пакет сообщений, и я застрял, чтобы угадать правильный формат сообщения. На данный момент у меня есть этот код ("msgpack5": "^ 4.2.1"):
publish(campaignId: number, quest: string) {
const channelId = `{channel:/${campaignId}}:pubsub`;
const now = String(new Date().getTime()).slice(0, 10);
const msg = [
'ch+msg',
`${campaignId}`,
300, // ttl
Number(now),
0, // tag
0, // prev_time
0, // prev_tag
quest,
'application/json',
];
const encoded = this.msgpack.encode(msg);
return this.redis.publishBuffer(channelId, encoded.slice());
}
Nginx регистрируется после выполнения кода выше
2020/01/16 09:09:04 [error] 7#7: REDISTORE: msgpack parsing error: Error reading type marker
2020/01/16 09:09:04 [error] 7#7: REDISTORE: thought there'd be a channel id around for msg
Related github проблема
версия Nchan из пакета nginx -extras (1.14.0-0ubuntu1.7) ubuntu 18.04