精华内容
下载资源
问答
  • 2020-12-30 17:37:21

    一、PUSH

    push是一种服务端向客户端发实时送通知的技术。
    常用的使用场景如:

    1. 消息提示。
    2. 事件提示。
    3. 内容推送。

    二、分类

    1. 通知消息

    支持离线推送,但是功能毕竟单一,就是在手机消息通知栏提示,点击该提示可以唤醒APP或打开网页。
    如:
    你的微信没启动,别人给你发消息时,手机通知栏就会有一个提示,你点击提示就打开了微信应用。

    通知类消息能否点击打开应用后进行自定义逻辑操作呢?当然可以!不是支持点击打开网页吗,去看看UrlScheme

    3. 透传消息

    只能在线推送,可以携带参数,收到消息的处理逻辑可由在应用中定制。
    如:
    你的维修已启动,别人给你发消息时,微信聊天列表上会有一个红点标记。
    如果是用的QQ,还能直接在其他页面上弹出一个对话框。

    三、现状

    1. Android

    因为谷歌的FCM通道被墙,国内的push百花齐放。
    有三方公司做这push服务,也有部分厂商自己创建系统级的push服务。
    整体事态对开发者接入十分不友好,导致安卓的送达率不太可靠。
    前面统一推送联盟的出现有可能挽救这样的局面,但暂时还需等待。

    2. iOS

    苹果的iOS系统统一使用APS通道,开发者只需对接苹果服务器即可完美送达。
    这一块上iOS系统还是毕竟省心。

    四、方案

    1. 统一推送联盟

    统一推送联盟这个是要是成功推广了,是最完美的解决方案。
    虽然成立3年了,但是目前在整体市场上的影响还有限。

    2. 各厂商推送

    可保在接入厂商的手机上实现离线消息推送,但接入。
    主要厂商有小米、华为、oppo、vivo、魅族等。

    3. 三方推送

    三方提供了对单独的push服务,主要有个推、极光等。

    如果你是Dcloud的用户,建议直接使用unipush,它使用个推的push服务并整合各厂商的push接口,是目前比较方便的接入方案。

    更多相关内容
  • 网页消息推送

    千次阅读 2020-07-27 13:21:36
    浏览器允许业务服务向用户客户端推送消息,...网页消息推送流程图如下所示: 整个过程主要可以分成订阅和推送这两部分,参与的角色主要有浏览器、浏览器推送服务、业务服务,下图可以看到这三者之间的关系(图片出自We

    浏览器允许业务服务向用户客户端推送消息,客户端收到推送消息后以通知的形式展示出来。业务运营人员可以通过这项功能定向给用户推送推荐消息或者重要通知,用于提升用户留存和用户使用时长。

    下文demo全部代码可以在news-push-example中看到。

    简述

    消息推送效果如下(当用户没有打开业务网站时,业务网站也能正常通知,在最终效果中有展示):
    推送效果

    网页消息推送流程图如下所示:
    消息推送流程

    整个过程主要可以分成订阅和推送这两部分,参与的角色主要有浏览器、浏览器推送服务、业务服务,下图可以看到这三者之间的关系(图片出自Web Push草案

        +-------+           +--------------+       +-------------+
        |  UA   |           | Push Service |       | Application |
        +-------+           +--------------+       |   Server    |
            |                      |               +-------------+
            |      Subscribe       |                      |
            |--------------------->|                      |
            |       Monitor        |                      |
            |<====================>|                      |
            |                      |                      |
            |          Distribute Push Resource           |
            |-------------------------------------------->|
            |                      |                      |
            :                      :                      :
            |                      |    Push Message(1)   |
            |   Push Message(2)    |<---------------------|
            |<---------------------|                      |
            |                      |                      |
    

    注:
    UA:浏览器客户端
    Push Service:浏览器推送服务。不同浏览器厂商会部署自己的推送服务。
    Application Server:业务服务。主要用于存放用户客户端订阅信息和向push service推送消息两部分工作。

    订阅流程:

    • Subscribe:浏览器向push service发起推送订阅,获得订阅信息。
    • Monitor:push service存放订阅信息,后面会使用订阅信息向特定浏览器下发通知。
    • Distribute Push Resource:浏览器将从push service获取到的订阅信息发给业务服务,业务服务将订阅信息和用户信息绑定存放起来。

    推送流程:

    • Push Message(1):业务服务使用Web推送协议将通知内容推送给push service。
    • Push Message(2):push servicee将通知内容下发给用户浏览器。

    订阅

    订阅主要任务如下图所示(图片来自How JavaScript works: the mechanics of Web Push Notifications
    订阅流程任务

    1. 网页获取通知授权
    2. 获得在推送服务中的订阅信息
    3. 将订阅信息存放到业务服务中

    网页获取通知授权

    通过调用Notification.requestPermission()接口来拉起授权申请,授权申请的效果如下所示(每个浏览器效果都不太一样,这里主要展示chrome的效果):
    申请通知效果

    代码展示如下:
    askPermission

    Notification.requestPermission()接口执行会返回授权结果,主要有granted(已授权)、denied(被拒绝)、default(被关闭)这3中状态。只有当授权结果为granted时,当前网页才能进行后面订阅推送服务和通知消息这两个步骤。

    注意:只有在用户没有授权或者拒绝的情况下,浏览器才会拉起授权面板。

    注册service work、订阅推送服务

    通过调用service work(后面都统一叫sw)注册对象上的订阅api来实现订阅推送服务,因此注册sw任务需要在订阅推送服务前执行。

    注册service work

    通过调用navigator.serviceWorker.register()接口来注册sw,代码展示如下:
    registSW
    navigator.serviceWorker.register()调用时,需要传入一个运行在服务工作线程(service work)的js文件。
    调用navigator.serviceWorker.register()会返回一个promise对象,我们可以在then链路中获得sw注册对象(registration)。

    订阅推送服务

    通过调用registration.pushManager.subscribe()获取订阅信息。

    在开始订阅推送服务前,我们需要确认以下两个任务是否完成:

    1. 用户已经授权网页通知
    2. sw注册成功

    1和2两个条件之间没有任何限制,这里使用Promise.all来让任务1和2并行,提升一点效率,代码展示如下:
    subscript

    registration.pushManager.subscribe()调用时需要传入了userVisibleOnlyapplicationServerKey这两个参数

    • userVisibleOnly:浏览器是否以通知的形式展示push service下发的推送消息,这里必须传true。
    • applicationServerKey:包含base64编码的公钥(publickKey)的DOMString或者ArrayBuffer。公钥(publickKey)可以在web-push-codelab网页中获取,也可以使用web-push npm工具快速生成,同时需要把私钥也记下来,后面push message步骤需要用到。

    registration.pushManager.subscribe()会返回一个promise对象,我们可以在then链路中获得订阅信息,订阅信息中主要有endpointkeys这两部分内容:

    • endpoint:推送服务链接,需要使用post方式请求该链接。
    • keys:用于加密推送的消息内容,防止消息内容被三方窃取。

    注意:谷歌浏览器推送服务是FCM服务(国内被墙),使用谷歌时,需要先翻墙,然后再调用registration.pushManager.subscribe api,这样才能成功订阅推送服务。

    订阅信息存放

    前端拿到订阅信息以后,将订阅请求传给业务后端,业务后端得到订阅信息以后,将订阅信息和用户关联起来,等到需要向用户推送消息的时候再提取该用户对应的订阅信息。

    推送

    推送的主要流程如下图所示(图片来自How JavaScript works: the mechanics of Web Push Notifications):

    1. 业务服务向push service推送消息
    2. push service向浏览器推送消息
    3. 浏览器展示消息

    推送消息

    当业务方需要向用户推送通知时,业务服务需要从数据库中取出用户的订阅信息,然后带着消息内容去请求订阅信息中的推送服务链接。请求推送服务时必须依据Web推送协议,node应用中可以使用web-push工具帮助我们快速实现请求推送服务功能,代码如下:
    push
    实现流程:

    • web-push工具设置VAPID keys
    • 读取服务器中存放的订阅信息。订阅信息中有endpointkey
    • 生成推送消息内容pushData、生成web-push配置options信息。
      • 推送消息内容必须是一个没有特殊字符的字符串或者是一个buffer对象,如果想传输json数据,可以将json数据转成buffer对象后再传输
      • options中的proxy字段是请求推送服务(谷歌、火狐的消息推送服务是被墙了的)时设置的代理(如果业务服务部署在大陆以外,就可以不用设置代理),其他参数可以在web-push中看到详解
    • 调用webPush.sendNotification()向push service推送消息

    注意:由于谷歌和火狐消息推送服务被墙了,我们可以在使用web-push工具推送消息时设置proxy参数来进行请求代理,也可以将业务服务部署在大陆以外。

    浏览器通知

    push service根据业务服务推送过来的客户端订阅信息,获取到具体的用户浏览器客户端后,将消息下发给浏览器,浏览器将消息解密以后,会去触发相应的service work的push事件,此时只要sw文件中监听push事件,就能够获取到业务服务端推送的消息内容。监听push代码展示如下:
    push-listener
    service work中通过调用self.registration.showNotification()函数拉起浏览器通知,代码中showNotification函数调用传参与通知UI的对应关系如下面两张图所示(更多参数可以在showNotification mdn中看到):

    当用户点击通知时,会触发sw中的notificationclick事件,同时,浏览器会将之前设置的action值一并传入回调函数,代码展示如下:
    notificationclick

    消息推送效果

    结语

    国内谷歌用户,如果没有翻墙,浏览器客户端将无法订阅FCM服务以及无法收到FCM服务下发的消息推送。业务服务在请求推送服务的时候,也需要设置设置代理,或者将业务服务部署到大陆外的网络。
    国内火狐用户,只要业务服务能够正常请求浏览器推送服务,那么用户浏览器客户端就能正常收到推送服务下发的消息。
    暂时测试国内的浏览器,但是据了解,国内的杀毒软件可能将浏览器通知当病毒来扫描,qq浏览器有开发推送服务但是好像没有开放出来使用。

    参考

    展开全文
  • Unipush移动端消息推送

    2021-07-29 09:35:46
    打开HBuilderX,双击项目中的“manifest.json”文件,勾选app模块配置中的Push(消息推送)-uniPush,将app进行云打包,包名自己定义,格式io.dcloud.HBuilder,并使用自有证书(自有证书获取地址:...

    1.安装app到手机

    打开HBuilderX,双击项目中的“manifest.json”文件,勾选app模块配置中的Push(消息推送)-uniPush,将app进行云打包,包名自己定义,格式io.dcloud.HBuilder,并使用自有证书(自有证书获取地址:https://ask.dcloud.net.cn/article/35777),最后将打包之后的apk文件在安卓手机上安装。

    2.开通unipush功能

    开通unipush功能(开通指南:https://ask.dcloud.net.cn/article/35716),在后台配置“厂商推送设置”,在各手机开放平台创建推送应用(创建流程:https://www.dcloud.io/docs/a/unipush/manufacturer.pdf),并获取配置参数,在unipush厂商推送配置中配置参数,最后进行在线消息与厂商离线消息推送测试。(UniPush使用指南:https://ask.dcloud.net.cn/article/35622

    3.后端java代码实现消息推送

    后端java代码用Java-sdk封装的Rest-V2实现,完整服务端厂商推送教程参考:https://docs.getui.com/getui/server/rest_v2/common_args/
    所用依赖:

    <dependency>
        <groupId>com.getui.push</groupId>
        <artifactId>restful-sdk</artifactId>
        <version>1.0.0.1</version>
    </dependency>
    

    实现方法:PushUtils.java(如下)。

    package com.fn.common.push.utils;
    
    import com.getui.push.v2.sdk.ApiHelper;
    import com.getui.push.v2.sdk.GtApiConfiguration;
    import com.getui.push.v2.sdk.api.PushApi;
    import com.getui.push.v2.sdk.common.ApiResult;
    import com.getui.push.v2.sdk.dto.CommonEnum;
    import com.getui.push.v2.sdk.dto.req.Audience;
    import com.getui.push.v2.sdk.dto.req.Settings;
    import com.getui.push.v2.sdk.dto.req.Strategy;
    import com.getui.push.v2.sdk.dto.req.message.PushBatchDTO;
    import com.getui.push.v2.sdk.dto.req.message.PushChannel;
    import com.getui.push.v2.sdk.dto.req.message.PushDTO;
    import com.getui.push.v2.sdk.dto.req.message.PushMessage;
    import com.getui.push.v2.sdk.dto.req.message.android.AndroidDTO;
    import com.getui.push.v2.sdk.dto.req.message.android.GTNotification;
    import com.getui.push.v2.sdk.dto.req.message.android.ThirdNotification;
    import com.getui.push.v2.sdk.dto.req.message.android.Ups;
    import com.getui.push.v2.sdk.dto.res.TaskIdDTO;
    import org.apache.commons.lang3.StringUtils;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * @ClassName: PushUtils
     * @Author: lxh
     * @Description: 移动端消息推送
     * @Date: 2021/7/9 10:22
     */
    public class PushUtils {
    
        private static final Logger logger = LoggerFactory.getLogger(PushUtils.class);
    
        /**
         * 应用配置
         */
        private static PushApi apiConfig() {
            GtApiConfiguration apiConfiguration = new GtApiConfiguration();
            apiConfiguration.setAppId("DEOB0OBf3LAjRDxDtgjEi7");
            apiConfiguration.setAppKey("7qPScWS7vS9u1fBjfUy4jA");
            apiConfiguration.setMasterSecret("LNUV32RYyq61tHmQCMYVg");
            // 接口调用前缀,请查看文档: 接口调用规范 -> 接口前缀, 可不填写appId
            apiConfiguration.setDomain("https://restapi.getui.com/v2/");
            // 实例化ApiHelper对象,用于创建接口对象
            ApiHelper apiHelper = ApiHelper.build(apiConfiguration);
            // 创建对象,建议复用。目前有PushApi、StatisticApi、UserApi
            return apiHelper.creatApi(PushApi.class);
        }
    
        /**
         * 配置推送条件
         */
        private static Settings getSettings() {
            //配置推送条件
            // 1: 表示该消息在用户在线时推送个推通道,用户离线时推送厂商通道;
            // 2: 表示该消息只通过厂商通道策略下发,不考虑用户是否在线;
            // 3: 表示该消息只通过个推通道下发,不考虑用户是否在线;
            // 4: 表示该消息优先从厂商通道下发,若消息内容在厂商通道代发失败后会从个推通道下发。
            Strategy strategy = new Strategy();
            strategy.setDef(1);
            Settings settings = new Settings();
            settings.setStrategy(strategy);
            //消息有效期,走厂商消息需要设置该值
            settings.setTtl(3600000);
            return settings;
        }
    
        /**
         * 推送消息体
         */
        private static void sendMessage(PushDTO<?> pushDTO, String title, String content, String payload, String intent, String url) {
            // 设置推送参数 requestid需要每次变化唯一
            pushDTO.setRequestId(System.currentTimeMillis() + "");
            pushDTO.setSettings(getSettings());
            PushChannel pushChannel = new PushChannel();
            //安卓离线厂商通道推送消息体
            AndroidDTO androidDTO = new AndroidDTO();
            Ups ups = new Ups();
            ThirdNotification thirdNotification = new ThirdNotification();
            logger.info("推送的消息体:" + title + content);
            thirdNotification.setTitle("离线标题:" + title);
            thirdNotification.setBody("离线内容:" + content);
            //ClickType:点击通知后续动作,
            //目前支持5种后续动作,
            //intent:打开应用内特定页面,
            //url:打开网页地址,
            //payload:启动应用加自定义消息内容,
            //startapp:打开应用首页,
            //none:纯通知,无后续动作
            if (StringUtils.isEmpty(payload) && StringUtils.isEmpty(intent) && StringUtils.isEmpty(url)) {
                thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_STARTAPP.type);
            } else if (StringUtils.isEmpty(payload) && StringUtils.isEmpty(url)) {
                thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_INTENT.type);
                thirdNotification.setIntent("intent:#Intent;action=android.intent.action.oppopush;launchFlags=0x14000000;" +
                        "action=android.intent.action.oppopush;component=io.dcloud.fire/" + intent + ";S.UP-OL-SU=true;" +
                        "S.title=" + title + ";S.content=" + content + ";S.payload=payload;end");
            } else if (StringUtils.isEmpty(payload) && StringUtils.isEmpty(intent)) {
                thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_URL.type);
                thirdNotification.setUrl(url);
            } else if (StringUtils.isEmpty(intent) && StringUtils.isEmpty(url)) {
                thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_PAYLOAD.type);
                thirdNotification.setPayload(payload);
            } else {
                thirdNotification.setClickType(CommonEnum.ClickTypeEnum.TYPE_STARTAPP.type);
            }
            ups.setNotification(thirdNotification);
            //各厂商自有功能单项设置
            ups.addOption("HW", "/message/android/notification/badge/class", "io.dcloud.PandoraEntry ");
            ups.addOption("HW", "/message/android/notification/badge/add_num", 1);
            ups.addOption("HW", "/message/android/notification/importance", "HIGH");
            ups.addOption("VV", "classification", 1);
            androidDTO.setUps(ups);
            pushChannel.setAndroid(androidDTO);
            pushDTO.setPushChannel(pushChannel);
    
            // PushMessage在线走个推通道才会起作用的消息体
            PushMessage pushMessage = new PushMessage();
            pushDTO.setPushMessage(pushMessage);
            GTNotification notification = new GTNotification();
            notification.setTitle(title);
            notification.setBody(content);
            if (StringUtils.isEmpty(payload) && StringUtils.isEmpty(intent) && StringUtils.isEmpty(url)) {
                notification.setClickType(CommonEnum.ClickTypeEnum.TYPE_STARTAPP.type);
            } else if (StringUtils.isEmpty(payload) && StringUtils.isEmpty(intent)) {
                notification.setClickType(CommonEnum.ClickTypeEnum.TYPE_URL.type);
                notification.setUrl(url);
            } else if (StringUtils.isEmpty(intent) && StringUtils.isEmpty(url)) {
                notification.setClickType(CommonEnum.ClickTypeEnum.TYPE_PAYLOAD.type);
                notification.setPayload(payload);
            } else {
                notification.setClickType(CommonEnum.ClickTypeEnum.TYPE_STARTAPP.type);
            }
            pushMessage.setNotification(notification);
        }
    
        /**
         * 对指定用户进行单推
         */
        public static void pushToSingle(String cid, String title, String content, String payload, String intent, String url) {
    
            PushDTO<Audience> pushDTO = new PushDTO<>();
            sendMessage(pushDTO, title, content, payload, intent, url);
    		//设置接收人信息u
            Audience audience = new Audience();
            audience.addCid(cid);
            pushDTO.setAudience(audience);
    		//进行cid单推
            ApiResult<Map<String, Map<String, String>>> apiResult = apiConfig().pushToSingleByCid(pushDTO);
    
            if (apiResult.isSuccess()) {
                // success
                logger.info("推送成功" + apiResult.getData());
            } else {
                // failed
                logger.info("推送失败" + "code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
            }
        }
    
        /**
         * 根据cid进行批量推送
         */
        public static void pushBatch(List<String> CIDs, String title, String content, String payload, String intent, String url) {
            PushDTO<Audience> pushDTO = new PushDTO<>();
            sendMessage(pushDTO, title, content, payload, intent, url);
    		//设置接收人信息u
            Audience audience = new Audience();
            PushBatchDTO batchDTO = new PushBatchDTO();
            batchDTO.setAsync(true);
            for (String cid : CIDs) {
                audience.addCid(cid);
                pushDTO.setAudience(audience);
                batchDTO.addPushDTO(pushDTO);
            }
    		//进行cid批量推
            ApiResult<Map<String, Map<String, String>>> apiResult = apiConfig().pushBatchByCid(batchDTO);
    
            if (apiResult.isSuccess()) {
                // success
                logger.info("推送成功" + apiResult.getData());
            } else {
                // failed
                logger.info("推送失败" + "code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
            }
        }
    
        /**
         * 对所有app用户群推通知
         */
        public static void pushAllApp(String title, String content, String payload, String intent, String url) {
    
            PushDTO<String> pushDTO = new PushDTO<String>();
            sendMessage(pushDTO, title, content, payload, intent, url);
            //群推
            ApiResult<TaskIdDTO> apiResult = apiConfig().pushAll(pushDTO);
    
            if (apiResult.isSuccess()) {
                // success
                logger.info("推送成功" + apiResult.getData());
            } else {
                // failed
                logger.info("推送失败" + "code:" + apiResult.getCode() + ", msg: " + apiResult.getMsg());
            }
        }
    }
    

    4.自有证书生成签名

    keytool -genkey -alias testalias -keyalg RSA -keysize 2048 -validity 36500 -keystore test.keystore

    5.自有证书查看签名

    keytool -list -v -keystore test.keystore
    Enter keystore password: //输入密码,回车

    展开全文
  • 原标题:PC浏览器消息实时推送的解决方案 ——EPush推送平台 陈华研发工程师,2014入职去哪儿网。参与研发的EPush推送平台,增强了订单推送的时效性,提高了酒店自助订单处理率。最近负责CEQ订单存储、Elasticsearch...

    原标题:PC浏览器消息实时推送的解决方案 ——EPush推送平台

    bc3b3659787814711383c964d38c6cba.png

    陈华

    研发工程师,2014入职去哪儿网。参与研发的EPush推送平台,增强了订单推送的时效性,提高了酒店自助订单处理率。最近负责CEQ订单存储、Elasticsearch集群搭建、维护与优化。参与去哪儿ebooking对接携程、艺龙订单项目的设计与编码。

    需求

    实现Ebooking系统首页订单核心数据的实时推送,提高酒店自助处理量。

    问题

    1、如何将订单实时地推送给商家

    2、服务器压力

    采用轮询的方式实现订单推送,当系统用户增多以及对消息的及时性要求增加时,轮询接口就会对服务器和数据造成巨大的压力。以无线酒店EBooking系统中的订单提醒来说,采用轮询接口(由开始的每3秒增加到后期的每30秒),该接口的qps达到800+/s,每天共计有5千万次请求。随着系统使用率的提高,该接口的qps还会继续提升。当时商家自助处理订单率40%左右。我们的期望值是达到60%。需要从轮询订单总数改为轮询查询订单核心数据。

    解决方案

    方案一:继续使用轮询的方式,增加服务器,申请新的数据库,继续保持30秒的轮询间歇或者更长,会有很多无效请求。

    方案二:采用WebSocket的方式,实现服务端推送消息。

    选框架:采用这种方式的问题又来了,我们还有部分商户使用的是IE低版本浏览器,只有IE10及以上版本才支持WebSocket。需要一个屏蔽浏览器的且支持WebSocket的框架,通过调研将WebSocket和轮询(Polling)机制以及其它的实时通信方式封装成了通用的接口,并且在服务端实现了这些实时机制的相应代码。WebSocket仅是框架实现实时通信的一个子集。

    socket.io后端的实现是采用nodejs。我们当时又有两种选择,一种是采用nodejs开发服务端,另一种方式是用java开发服务端。最终选择netty作为服务端的开发框架,为dubbo和qmq服务的使用提供了便捷。

    建立EPush平台

    一、EPush平台简介

    浏览器消息实时推送平台。

    二、EPush平台交互

    c2d3c1deefac0d454e3e09bf785ae505.png

    1、浏览器调用EPushSever建立连接,带上uid和sid,Uid为业务推送的标识。 例如:eb的账号或qunarman账号

    2、EPushSever告知业务系统用户连接已经建立推送QMQ消息uid.

    3、业务系统通过提供的EPushClient 直接调用push接口完成推送。

    4、EPushServer通过Sid和Uid的关系将消息推送给浏览器端。

    三、EPush推送平台设计

    工程结构:

    API模块:对外提供的client接口。

    Model模块:EPush平台相关的实体模型。

    Service模块:包含EPush服务类、消息推送、连接认证、异常处理等相关功能。

    Server模块:包含EPush依赖的Servlet,提供EPush服务生命周期管理功能。

    平台功能:

    1.简洁生命周期管理

    EPushServer: EPushServer使用HttpServlet进行生命周期管理,在Server容器启动时EPush服务启动。通过http请求可以上下线EPush服务,可强制刷新所有socket连接页面。客户端建立和关闭连接时都会发送QMQ消息,在发送QMQ消息时做了10秒的延迟,防止用户频繁刷新页面导致qmq过多。

    2.资源分配与隔离

    分配:新加入的应用可以指定机器某几台机器提供服务

    隔离:消息隔离:通过QMQ订阅主题

    3.系统性能、可用性、安全性

    并发推送:消息推送采用异步推送机制。

    连接认证:为了防止恶意的client连接,在建立连接时候EPush平台实现了两种认证机制,一种支持用户中心的cookie认证。一种支持应用接入初始化时设置的接口认证。

    异常处理:重写netty-socketio异常监听类,实现异常监控,及时推送给研发人员发现和解决问题。

    EPush的平台的快速接入:

    1.引入EPush客户端

    com.qunar.hotel

    epush-api

    1.0.9

    2.配置Spring bean

    eb7bc02c3dd2370114917940b453ce78.png

    3.代码中注入EPushClient

    @Resource private EPushClient ePushClient;

    4.调用pushMessage接口推送消息

    PushResult pushMessage(EPushMessage message)

    总结

    3e0eef515db5d53c44d4256450ccf403.png

    如上图所示:EPush服务关闭时,EBooking系统轮询请求达到1000+/s。

    EPush推送服务运行两年以来,服务稳定。有效的减小了服务器压力、提高了消息时效性、减少了浏览器的无效请求。ebooking系统实时在线连接,峰值达到8w个连接数。希望有需要的项目接入EPush推送平台共同提高。

    欢迎留言交流或投稿,和我们一起分享知识。

    1b3f3ac1420fe74f3bd05dce4b5fd762.png

    c75fc7a721c0919128b594e467dee286.png

    责任编辑:

    展开全文
  • 什么是push.js,A compact, cross-browser solution for Javascript desktop notifications 网页端即使消息推送插件.主要用于消息的即使提醒.
  • html5+ push-消息推送

    千次阅读 2018-10-08 15:17:11
    Push模块管理推送消息功能,可以实现在线、离线的消息推送,通过plus.push可获取推送消息管理对象。 方法: addEventListener: 添加推送消息事件监听器 clear: 清空所有推送消息 createMessage: 创建本地消息 ...
  • 华为推送服务(Push)

    千次阅读 2019-06-05 22:56:22
    终端用户点击对应的通知栏消息触发相应的动作,如打开应用、打开一个网页、打开应用内某界面 透传消息由开发者的APP自主解析自定义内容,并触发相关动作,华为PUSH仅仅提供通道能力。利用此功能开发者可以实现好友...
  • 人工智能-项目实践-即时聊天-使用PHP+Swoole实现的网页即时聊天工具 使用PHP+Swoole4实现的网页即时聊天工具,在线体验地址:...基于Server PUSH的即时内容更新,登录/登出/状态变更/消息等会内容即时更新
  • uniapp unipush点击推送到指定页面

    千次阅读 2020-12-15 15:16:23
    plus.push.addEventListener( 'click', msg => { setTimeout(function() { uni.navigateTo({ url: '/pages/tabbar/tabbar-5/systemMsg/systemMsg' }); }, 1000); }, false ...
  • 消息系统该Push/Pull模式分析

    千次阅读 2018-06-29 16:23:20
     无论是消息系统,还是配置管理中心,甚至存储系统,你都要面临这样一个选择,push模型 or pull模型?是服务端主动给客户端推送数据,还是客户端去服务器拉数据,一张图表对比如下:   push模型 pull模型 描述 ...
  • web 网站消息管理模块一般都是用户主动请求消息通知,即使采用 socket 技术,也仅仅只是在用户浏览当前系统网站时,才能发现系统推送的消息通知,这样很容易造成消息通知不到位,发现不及时。本场 Chat 利用 HTML5 ...
  • uni-app unipush + 个推 实现推送服务全过程(干货)

    千次阅读 多人点赞 2021-02-11 16:10:47
    /* 5+ push 消息推送 ps:使用:H5+的方式监听,实现推送*/ plus.push.addEventListener("click", function(msg) { console.log("click:"+JSON.stringify(msg)); console.log(msg.payload); ...
  • push-消息推送

    千次阅读 2019-01-09 14:09:00
    Push模块管理推送消息功能,可以实现在线、离线的消息推送,通过plus.push可获取推送消息管理对象。 方法: addEventListener: 添加推送消息事件监听器 clear: 清空所有推送消息 createMessage: 创建本地消息...
  • 支持邮件,pushover,微信提醒(support by server酱),Bark推送,自定义GET/POST通知, Slack 通知以及 Telegram 通知 支持一个任务多个选择器提取信息 支持自定义消息模板 简洁的UI,可视化操作 支持自定义请求头...
  • APNs Push Notification教程一

    千次阅读 2018-12-15 12:26:33
    ##说明push的作用## push notifications allow developers to reach users and perform small tasks — even when users aren’t actively using an app! In this tutorial, you’ll learn how to configure your ...
  • RN中热更新CodePush使用

    千次阅读 2019-04-25 19:19:51
    RN中涉及到热更新使用微软提供的CodePush插件实现,具体使用如下: 更新流程 1、安装 code-push-cli插件(在项目根目录) ...npm install -g code-push-cli //全局安装code-... 此时会打开一个网页 选择一个...
  • # 前言 很多时候,原生应用会通过一些消息推送来唤起用户的关注,增加驻留率。网页该怎么做呢?有没有类似原生应用的推送机制?推送功能又能玩出什么花样呢?
  • 关于unipush的推送还是用个推的文档和SDK,下载个推的SDK整合进PHP框架里,然后...话不多说,上代码:$title为推送标题,$content为推送内容,$payload为点击通知加自定义消息,$cid为推送cid,$package为APP包名,"...
  • CodePush热更新组件详细接入教程 什么是CodePush CodePush是一个微软开发的云服务器。通过它,开发者可以直接在用户的设备上部署手机应用更新。CodePush相当于一个中心仓库,开发者可以推送当前的更新(包括JS/...
  • code-push-server的私有化部署

    千次阅读 2019-09-18 11:02:19
    一、开启关闭code-push-server 开启code-push-server服务器:cd到code-push-server目录下,使用命令./bin/www开启服务器,或者直接点击该文件(充分条件是要打开MySQL服务器) 关闭code-push-server服务器:直接...
  • 我的应用是:1、网页使用个推的消息透传模板(php的)发送给app客户端:$template->set_transmissionContent("{'title':'测试标题','content':'test content','payload':{'MsgID':'1234567890'}}");注意:内容是...
  • @PushoverApp支持通过计算机向不同设备上的pushover app同时发送通知,可用于满足自动监控、同步通知等需求。 网页端进入官网,注册账号后进入首页: 上图左上角"push a notification"支持通过该页面直接向不同...
  • uni push推送 tp6

    2021-05-16 19:57:45
    https://ask.dcloud.net.cn/question/108521 里有大佬说只能透传消息来执行播报,那就很好办了 ... console.log('监听消息推送'); console.log(message); // TODO let order_video = plus.audio.create
  • [Push]百度消息推送的应用

    千次阅读 2017-04-29 15:02:51
    百度消息推送的应用实例
  • php uinPush消息推送

    千次阅读 2022-04-18 16:15:46
    $api = new \GTClient($this->url,$this->appKey,$this->... $push = new \GTPushRequest(); $push->setRequestId(md5(time() . mt_rand(1, 9999999)));//请求唯一标识号,10-32位之间;如...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,437
精华内容 9,374
关键字:

网页消息push