web管理后台:商城订单实时提醒怎么实现呢?
发布于 6 年前 作者 whw1988 6119 次浏览 来自 问答

1.轮寻。(轮训的定时器要放在哪个ejs下面,用户要是没打开那个ejs岂不是无法轮训了?) 2.长连接

10 回复

websocket了解一下

@scarletmu 登陆后就实时连接?

1.定时器或者长链接的客户端 放在哪个页面 感觉都不合适(因为只有点击那个页面,定时器或者长链接才会启动)。 2.每个页面都会引入head.ejs 和 foot.ejs,在head.ejs里面加入定时器或者长链接,感觉有点别扭,因为点击每个页面,head.ejs都会重新加载

segmentfault网站的消息提醒是用的websocket

@Liaozhenting 那它websocket的初始化连接,是放在哪个页面呢? 放在公共页面?

@whw1988 不太清楚.也许是公共头部文件.毕竟只有头部有消息提醒.这个网站每次进入一个新页面,它都重新起了一次socket连接.参数也不一样.head.ejs都会重新加载也不什么别扭的事情,毕竟不是单页面

多页的话 web worker的SharedWoker,service worker了解一下?

不知道你用的前端是什么, angular2 有一个top-level module, 可以实现

工具:redis(pub/sub功能)+socket.io

步骤:

  • 负责交易的后端,当产生订单消息时,将订单消息publish至redis的某个channel
  • 管理后台subscribe 之前定义的redis channel,并将获取的消息通过socketio分发给前端
  • 前端socketio获取推送过来的数据并展现

代码:

交易后端publish redis

 // 产生订单后,立刻把相关信息publish至redis,这里给channel命名为`order`
  redis.publish('order', JSON.stringify({ itemId: 1} }));

管理后端subscribe redis并使用socketio

const socket  = require("socket.io");
const { redis } = require("./config");
const client = require("redis").createClient(redis);
client.subscribe("order"); // subscribe上面自定义的channel名order

module.exports = (server) => {
  const io = socket(server);
  client.on('message', (channel, response) => {
	  // 收到消息后,立刻使用socketio分发给客户端
      io.emit('msg', response);
  });
};

前端socketio

    socket.on('msg', (data) => {
		// consume data
	});

找一个MQTT消息服务器 // 服务器直接调用 MQTT 服务器的 REST API axios.post(’/api/publish’,{ topic, msg, qos })

// 客户端使用 MQTT.js 服务器配置好认证 client.connect(‘ws://host:port, { clientId: xxx, username: yyy, password: zzz }) client.subscript(’/order’, handleMessage) handleMessage(topic, payload) { console.log(paylod.msg) }

回到顶部