请选择 进入手机版 | 继续访问电脑版
设为首页收藏本站

亿仁网

 找回密码
 立即注册

扫一扫,访问微社区

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 5167|回复: 0

基于websocket的简单广播系统

[复制链接]
  • TA的每日心情
    奋斗
    2019-3-14 22:24
  • 签到天数: 160 天

    [LV.7]常住居民III

    1074

    主题

    1139

    帖子

    1万

    积分

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    18046
    发表于 2018-11-14 22:47:01 | 显示全部楼层 |阅读模式

    那时为了实战对战,想到需要一个实时性很强的技术实现,于是我去实现了一个websocket server,没想到后来这些小程序没有成,但是我们的这个web socket server 演化得无处不在。下面介绍一下这个技术实现。看理论肯定会有点拗口是不是,我们直接上代码就得了。我们现在假设有这么一个用户付款的逻辑,在写用户付款事件时,我们事先并不知道以后还需要加什么逻辑,于是我们先把这个行为广播出去。以下是伪代码:

    1.     req := httplib.Post("https://ws.app.12zan.net/eventcast/user/5fe")
    2.     text, er := zanjson.Encode(order)
    3.     if er != nil {   
    4.         log.Println(ev)
    5.         return
    6.     }
    7.     req.Param("data", string(text))
    8.     resp,_ = req.Response()
    复制代码

    现在,每当有用户付款时,这个用户系统都会往/eventcast/user/5fe这个频道广播一条消息。但是很遗憾,目前没有客户端订阅这类消息,所有的消息都被丢弃了。有一天,我们英明神武的老板决定要加一个通知,每当有一个新的用户付款时,都给公司的同胞们发一个邮件通知一下,我们获得了新的付费用户,好让大家小开心一把,尤其是第一个试用客户付费的时候,我们肯定都要开心地跳起来。这时我们如果去改线上运行好的付款系统,还是有点儿风险的,一旦有修改,我们就得走一下测试流程,不然万一有问题不是影响公司发财了吗。没关系,我们之前不是已经把付款事件广播出来了吗,我们现在用起来。写这么一段js,线上运行起来,就好了。

    1. const webSocket = require('ws');
    2. let ws = new webSocket("wss://ws.app.12zan.net/eventcast/user/5fe");
    3. ws.on('open', function open() {
    4.     console.log("connected");
    5. });
    6. ws.on('message', function incoming(data) {
    7.     let user = JSON.parse(data);
    8.     Mail.send("一个叫"+user.name+"的好心人支付了"+user.amount+"元,让主赞美他!");
    9. });
    复制代码

    现在一旦有人付款,我们全公司都能收到一个邮件,及时得到这一好消息了。让我们小小地庆祝一下吧。接下来又过了几天,我们想改进一下体验,用户一旦付款成功,就发送一条短信,告知用户他的有效期和我们的24小时客服电话;只需要这么一段代码部署起来运行就好了, 之前的任何代码都不用动:

    1. const webSocket = require('ws');
    2. let ws = new webSocket("wss://ws.app.12zan.net/eventcast/user/5905e89db43fec42e3055df05ff72afe");
    3. ws.on('open', function open() {
    4.     console.log("connected");
    5. });
    6. ws.on('message', function incoming(data) {
    7.     let user = JSON.parse(data);
    8.     let expiresAt = (zan.Date.now().add("+365 day").format("YYYY-mm-dd"));
    9.     SMS.send(user.Mobile,"尊敬的"+user.name+",您成功购买了十二赞旗舰版,有效期至"+expiresAt+",请登陆:https://www.12zan.cn 查看,如有任何疑问,欢迎致电4006681102");
    10. });
    复制代码

    发送通知邮件和发送告知短信,都基于用户付款动作,但是发邮件和发短信的代码完全隔离,相互之间出完全不知道对方的存在。


    造物之前,必先造人。
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    QQ|Archiver|手机版|小黑屋|亿仁网 ( 粤ICP备16098737  

    GMT+8, 2020-8-12 06:26 , Processed in 0.200453 second(s), 26 queries .

    Powered by Discuz! X3.4

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表