问题背景
苹果的消息推送是通过请求域名:https://api.push.apple.com实现的,域名解析结果为美国,造成了两个问题:1.接口请求时间长,性能低,请求超时容易报错。
2.推送请求的错误率在高峰期间会增加。
00-1010总体思路:增加一个美国代理服务器,通过代理服务器请求苹果消息推送服务。
1.原始流程
2.当前流程
3.具体方案实施的选择
方案一:代理服务器,部署前向代理服务,为推送消息提供前向代理,消息通过代理服务器传递给苹果服务器。
选项2:代理服务器,独立实现和部署标准apns服务,负责推送ios消息。将需要转到美国节点的请求转发到代理节点。
方案制定
具体情况,具体分析,需要考虑的点:首先,苹果提供的官方SDK不支持设置代理服务器。官方的SDK不适合改动,对以后的系统更新不利。
第二,只需要代表苹果的推送服务,华为、小米、vivo等其他不应该在海外代表。
第三,代理安全
第四,在代理方案下,有重试逻辑。如何准确定义和判断失败可能会造成消息的重复推送。
5.实现简单、有效、正向代理模式:只需要实现一个实例化对象方法,其他可以使用原sdk。自主apns服务模式:需要实现一个apns服务,需要在国内外进行服务部署,需要增加自主开发和运营成本。此外,还需要对调用服务进行改造,实现请求调度。优点是服务独立、单一,具有独立的微服务条件。
方案选择
github.com/sideshow/apns2
代理SDK(解决方案前提)
hmdhm:修改SDK文件第一步:设置环境变量。
导出http _ proxy=http://my . proxy server.com :80
导出https _ proxy=https://my . proxy server.com 3360443步骤2:修改apns2。新客户端方法
func NewClient(证书tls。证书)*客户端{
tlsConfig :=tls。配置{
证书: []tls。证书{证书},
}
if len(证书。证书)0
tlsConfig。BuildNameToCertificate()
}
transport :=* http . DefaultTransport .(* http。运输)
运输。TLSClientConfig=tlsConfig
err :=http2。配置传输(传输)
如果出错!=零
恐慌
}
返回客户端{
HTTPClient: http。客户端{
运输:运输,
Timeout: HTTPClientTimeout,
},
证书e:证书,
主机:默认主机,
}
}方法2 :重新定义了一个NewClient方法。
func NewProxyClient(证书tls。证书)*apns2。客户端{
proxyUrl,err :=url。解析(' https://my . proxy server.com :443 ')
如果出错!=零
返回零
}
tlsConfig :=tls。配置{
证书: []tls。证书{证书},
}
if len(证书。证书)0
tlsConfig。BuildNameToCertificate()
}
传输:=http。运输
TLSClientConfig: tlsConfig,
ForceAttemptHTTP2:为真,
代理: http。proxurl(proxurl),
}
http2。配置传输(传输)
proxyClient :=apns2。新客户(证书)。生产()
临近客户端。传输=传输
返回代理客户端
}