苹果APNS的HTTP2协议Provider API,是一个比较新的接口,简单研究了一下,觉得这个方向需要搞一个库来实现一下这种:
1.现在后端服务化的趋势下,化零为整之后又是化整为零,简单说就是有一个类似google或者apns这种平台级的接口(HTTP/2 + TLS 也可以直接叫h2,应该是未来的趋势)
2.大多数的开发者还需要一个更下游的接口来搞定这里的复杂度,
3.通用的一个实现大量client connection库,有比较大的现实意义。
一般来说,一个好的库,本质上是一个通用框架,抽象的解决了一类问题,具体的实现类似一个demo。
比如说SSL,其实就是一个EVP BIO上的demo
现在还说不清楚想法,暂且草记之
/* ------------ 想法 模块化,最好除去输入输出以后逻辑部分能独立编译 最好最好能成为一个api库,实现apns协议,兼顾性能 输入部分mq或者其他方式 接口是 message 输出cycle点,挂接hook,发msgsycle的,发result的,发feedback的,证书失效的 make standalone 时候输出的default hook打log,输入用本身可以命令行调用 apns2 --devicetoken/--uid --appkey/--pem --msg 最好无状态, 不行分两级队列,别全锁 kill -TERM 优雅终止 部署上不区分012队列,争取无级变速 队列部分api话,可能允许更换 是否多线程看情况 空闲时任务idle-task 状态监控,最好是写状态文件pid.status gc 检查一下很久没用的appkey,把连接关了 -------------- ----------- 部署结构 apns2 -d --daemon ctl-apns2 pid/22222.time conf/ log/ script/ certfile/ ----------- 处理点 取token 成功失败超时 取badge 成功失败超时 取certs 成功失败超时 dns connect ssl_connect loop send(req) res = recv() ------------- lib jemalloc nghttp2 ------------- date structure */ namespace apns2 {} typename msgid_t; typename appkey_t; typename payload_t; typename time_t; typename uuid_t; typename uid_t; typename token_t; typename badge_t; struct message { msgid_t msgid; appkey_t appkey; payload_t payload; time_t received; time_t expiration; //prior_t priority; not impl default=10 }; struct node { uuid_t id; uid_t uid; token_t token; badge_t badge_value; msgid_t msgid; time_t ready; time_t sent; time_t responsed; state_t current; }; struct payload_t { msgid_t msgid; time_t create;//?创建时间 byte[] data; }; struct stream_t { int stream_id; }; struct connection_t { appkey_t appkey; hash<stream_id,stream_t> streams int sockfd; SSL ssl; time_t timeout }; send(stream_t,buf); recv(stream_t,buf); struct certificate { appkey_t appkey; certfile_t certfile; }; struct timer_t { timerfd fd; lambda f; }; ------------ multiplexer { set<connection_t>() } class queue { public: enqueue(node n); dequeue(const uuid_t& id); node peek1(); node peek1(const uuid_t& id); associate(payload_pool p); }; class payload_pool { public: add(payload_t p); del(msgid_t msgid); }; /* ---------- connect ----- state machine of node ------ flow ------- :host api.development.push.apple.com:2197 :method POST :path /3/device/<device-token> ----- apns-http2/ apns-http2.h api jpush-apns2.h framwork,commlib,jpush jpush-apns2.cpp set config,set hooks etc,jpush only main.cpp main third/ http-parser/ nghttp2/ uv.h/ t/ ------------ 问题,ssl连接 string push(string token, string certificate, string payload); 功能 目前如果一个msgid取到了,就不能再发回去了,其实应该发回去重试 先考虑机制,数据结构正确了,策略很简单 */
时间: 2024-10-23 08:12:56