消息推送看着就是调一个发送接口,但"推给谁、推什么、什么时候推"这三件事没想清楚,上线后问题一堆:推错人、内容超长被截断、集中推送被限流。这篇按这三个问题把推送功能的实现捋一遍。
接口层用的是Eyun 平台开放的企微 API,推送走 message 模块。
推给谁:目标解析
推送目标有两类:内部员工和外部客户。员工用 uin 定位,客户用 uin 或手机号查。目标解析通常有三种方式:直接给 uin、按标签筛选、按部门批量。
标签筛选用列表接口先拉出成员,再逐个推。解析放在推送前统一做一次,别在发送循环里重复查。
推什么:内容构造
纯文本用 sendText,带标题描述和链接的用 sendRichText。内容构造有两个注意点:一是长度上限,超了要截断或分条;二是卡片字段,title、description、url 各有自己的长度限制。
如果推的是纯文本,把关键信息放在前 30 个字,员工在消息列表里能一眼看到重点。
什么时候推:即时与定时
即时推送:事件发生就推,比如审批通过通知申请人。
定时推送:日报周报这类,用定时任务批量推。定时任务要错峰,别整点集中发,容易被限流。
事件触发的推送还要注意并发:同一秒多个事件推给同一个人,消息会刷屏。加一层合并,短时间窗口内同一人的多条通知合成一条再发。
失败补救
发送失败分两类:可重试的(限流、超时)进重试队列,不可重试的(参数错、会话错)记流水转人工。每次推送写一条流水,记目标、内容摘要、结果,方便追溯。
结尾
消息推送的坑基本都集中在目标和时机上——推给谁要解析准,什么时候推要错峰,失败了要有补救。这三点做到位,推送功能就能稳。