前言

只有光头才能变强。

文本已收录至我的GitHub精选文章,欢迎Starhttps://github.com/ZhongFuCheng3y/3y

自从做了推送以后,每隔一段时间就发现有各大的公司推送事故出现。

你问我做开发的慌不慌,我当然慌得一批了

为什么经常会有推送事故

为什么会经常出现类似的事故呢?我认为最主要的原因是:预发和线上的环境是同一套

众所周知,我们的系统都有几套的环境(比如说本地/线下/预发/线上 环境),其中大多数公司的预发和线上环境数据库是同一套的,只是预发环境调用的是预发环境的接口,线上环境调用的是线上环境的接口而已。

推送这种系统的线上和预发环境其实没多大的区别,因为在底层是调用外部的接口来实现发送的,所以预发和线上环境其实调的都是同一个接口

科普一下推送是怎么做的

之前写过一篇关于推送的文章,也算是科普了一把什么是推送消息,有兴趣的同学可以去看看: 三歪带你了解什么是Push消息推送。这次在上面的文章基础上补全一下。

Push推送消息能够在你手机闭屏时(即便你没有打开APP),通过通知来给你推送信息,是一种能够直接触达用户的消息推送

要给用户下发消息,我们得维护APP 客户端和服务端的「长连接心跳」。这个长连接心跳如果由我们自行来维护,难度会很大,绝大部分的公司不会自建推送服务

目前我们手机类型分为两种:安卓和iOS

  • iOS我们默认走的是官方推送的渠道APNS。iOS 在系统层面与苹果 APNs(Apple Push Notification service)服务器建立连接,系统收到 APNs 服务器消息后会帮我们转发到相应的APP上
  • 安卓由于Google在国内访问不稳定,在国内暂未统一掉推送服务。目前更多的是众多的手机厂商在其定制的系统中也内置了推送功能,如小米、华为等。由于接入成本的问题,也出现了大量的第三方推送服务提供商,比如个推、极光、友盟。
    • 工信部牵头成立的“安卓统一推送联盟”还在期待中

总结:

  • iOS端我们更多用的是APNs服务器下发推送消息
  • 安卓端由于接入成本的问题,更多的是接入各个第三方推送服务提供商,第三方推送服务提供商也会接入对应的手机厂商来实现对消息的下发

我们做了什么预防推送事故?

在大多数情况下,推送事故往往是「运营」的推送导致的。运营要推送消息给用户,首先需要圈选一个人群去推送。

人群量需要管控:我们在圈选的时候,如果运营圈定的人数大于一个阈值,我们会走邮箱让主管确认是否需要圈选这么一个大的人群去推送。

这块有两个目的:

  1. 首先我们是认为推送的人群应该是精细化的,什么标签的人群应该收到什么的推送。不应该圈定一个庞大的人群去推送同一条文案的消息(新闻APP除外)。
  2. 即便出了事故,也只是一部分用户能收到,而不是全体用户。

在我们的系统是没有全体用户推送的。

在运营圈定人群后,我们会有单独的测试功能去「测试单个用户」是否能正常下发消息,文案链接是否存在问题。

这一个步骤是必须要做的,给用户发出的消息,首先要经过自己的校验。如果确认链接和文案都无问题后,则提交任务,走工单审批后才能发送。

如果在启动之后发现文案/链接存在问题,还可以拦截剩余未发的消息。

针对于通知类的消息(技术方推送),我们在预发环境下配置了「白名单」才能收到消息。

线上消息有「去重」的逻辑:

  • 在某段时间内,过滤掉重复消息
  • 运营类消息推送(圈定人群的方式去下发消息)同一个用户需要相隔一段时间才能下发一次。

虽然说,我们制定了很多的规则去尽量避免事故的发生,但不得不说推送还是一个容易出现事故的功能。

我的牛逼已经吹完了,如果某天发现我的推送出了事故,不要@我,当没见过这篇文章就好。

各类知识点总结

下面的文章都有对应的原创精美PDF,在持续更新中,可以来找我催更~

涵盖Java后端所有知识点的开源项目(已有7 K star):https://github.com/ZhongFuCheng3y/3y

如果大家想要实时关注我更新的文章以及分享的干货的话,微信搜索Java3y

为什么PUSH推送要经常背锅?的更多相关文章

  1. iPhone的Push(推送通知)功能原理浅析

    第一部分:Push原理(以下绝大多数内容参考自.图片来自iPhone OS Reference Library)机制简介Push 的工作机制可以简单的概括为下图图中,Provider是指某个iPhon ...

  2. 58同城高性能移动Push推送平台架构演进之路

    本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需要,原理和方案对比:移动Push推送第一阶段(单平台)架构如何设计:移动Push推送典型性能问 ...

  3. 转: 58同城高性能移动Push推送平台架构演进之路

    转: http://geek.csdn.net/news/detail/58738 文/孙玄 本文详细讲述58同城高性能移动Push推送平台架构演进的三个阶段,并介绍了什么是移动Push推送,为什么需 ...

  4. 移动端Push推送

    移动端Push推送 移动端开发逃不掉要做推送,这里给出服务端一种省时省力的解决方案. iOS:PushSharp.Apple.苹果有自己的推送服务,我们按照规则推送数据就好.这里我选取PushShar ...

  5. 浅谈push推送的一点感受

    在手机已成为生活必不可分的一部分,push服务伴随而来.ios的apns,android随着谷歌退出中国市场,各家在android的推送不断展开.有厂商的推送,如小米.华为.魅族.oppo等,还有中间 ...

  6. push推送服务设计

    PUSH系统架构设计简述 一.网络传输协议的选择 PUSH系统协议选取: UDP协议实时性更好,但是如何处理安全可靠的传输并且处理不同客户端之间的消息交互是个难题,实现起来过于复杂,那就非TCP协议莫 ...

  7. Android push推送消息到达成功率优化

    Android push推送消息到达成功率优化 问题:server向client发送消息.未考虑client是否在线,这种消息到达率是非常低的. 第一次优化:使用server离线缓存数据,推断假设cl ...

  8. Push推送原理

    Push 的工作机制 APNS 是Apple Push Notification Service(Apple Push服务器)的缩写,是苹果的服务器. 推送可以分为三个阶段. 第一阶段:.net应用程 ...

  9. Android应用实现Push推送消息原理

            本文介绍在Android中实现推送方式的基础知识及相关解决方案.推送功能在手机开发中应用的场景是越来起来了,不说别的,就我 们手机上的新闻客户端就时不j时的推送过来新的消息,很方便的阅 ...

随机推荐

  1. Spring Cloud 系列之 Gateway 服务网关(二)

    本篇文章为系列文章,未读第一集的同学请猛戳这里:Spring Cloud 系列之 Gateway 服务网关(一) 本篇文章讲解 Gateway 网关的多种路由规则.动态路由规则(配合服务发现的路由规则 ...

  2. 接触 Jmeter

    Apache JMeter是 Apache组织开发的基于 Java的开源压力测试工具.接口以及自动化测试. JMeter 可以进行参数化测试,实现自动化脚本与测试数据分离,能够对应用程序做功能/回归测 ...

  3. Python - Python算法之冒泡算法的超简单实现

    [原创]转载请注明作者Johnthegreat和本文链接 冒泡排序在算法中算是最简单也最容易实现的,这里介绍一个非常简单实现的代码: def bubble_sort(ls): for first in ...

  4. python执行提示“ImportError: No module named OpenSSL.crypto”

    错误信息如下: Traceback (most recent call last): File "/usr/local/yunanbao/yxz-script/autoops/TaskSer ...

  5. 数值计算方法实验之Lagrange 多项式插值 (Python 代码)

    一.实验目的 在已知f(x),x∈[a,b]的表达式,但函数值不便计算,或不知f(x),x∈[a,b]而又需要给出其在[a,b]上的值时,按插值原则f(xi)= yi(i= 0,1…….,n)求出简单 ...

  6. Redis 的 maxmemory 和 dbnum 默认值都是多少?对于最大值会有限制吗?

    一.Redis 的默认配置 了解 Redis 的都知道,Redis 服务器状态有很多可配置的默认值. 例如:数据库数量,最大可用内存,AOF 持久化相关配置和 RDB 持久化相关配置等等.我相信,关于 ...

  7. linux下批量删除文件

    1. 在linux批量删除多级目录下同一格式的文件,可采用find + exec命令组合: 如在删除old目录下的,所有子目录中,后缀为.l的文件方法为: find old -type f -name ...

  8. http的长连接与端连接

    长连接的定义:  HTTP1.1规定了默认保持长连接(HTTP persistent connection ,也有翻译为持久连接),数据传输完成了保持TCP连接不断开(不发RST包.不四次握手),等待 ...

  9. Spring Boot JPA的查询语句

    文章目录 准备工作 Containing, Contains, IsContaining 和 Like StartsWith EndsWith 大小写不敏感 Not @Query Spring Boo ...

  10. Scala的自定义类型标记

    Scala的自定义类型标记 Scala中有很多千奇百怪的符号标记,看起来是那么的独特,就像是一杯dry martini-好像黑夜中的萤火虫,那么耀眼,那么出众. 好了言归正传,这一篇文章我们会讲一下S ...