开始筹备搞一个实现HTTP/2的provider

苹果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

开始筹备搞一个实现HTTP/2的provider的相关文章

微信为什么要搞一个小游戏?

众厂关于 H5 游戏市场的争夺,自 2014 年以来,一直就没有停止过.但一直也没有尘埃落定,最终花落谁家,鹿死谁手现在还不好讲.微信推出小程序,继而推出小游戏,只是腾讯数年来在 H5 市场企业战略的一环. 微信为什么要自定义一套技术,起名为小程序?明明就是原来的 H5 技术,为什么 CSS 不叫 CSS,叫 WXSS:为什么 HTML 不叫 HTML,叫 WXML:为什么明明有 JS.TS,还要自主研发一个 WXS,并且声称"WXS 与 JS 是不同的语言,有自己的语法,并不和 JS 一致&q

之前想搞一个nim但因为是自用我会持续修复完善

异步方式的优点:客户端和服务端互相解耦,双方可以不产生依赖.缺点是:由于引入了消息中间件,在编程的时候会增加难度系数.此外,消息中间件的可靠性.容错性.健壮性往往成为这类架构的决定性因素. 幸运的是程序员这个职业不像运动员那么惨烈,借用上面的评分标准,假如把奠定计算机行业基础的那一批图灵奖得主级别的程序员定义在 90-100 分档,那么我们很多靠编码为生的程序员的基本都在 1-10 分档间分布,而业余的只是写写 Demo 的程序员可能就是在 0.x-0.x 之间了.所以,进入职场首先我们需那样先

用Keras搞一个阅读理解机器人

catalogue 1. 训练集 2. 数据预处理 3. 神经网络模型设计(对话集 <-> 问题集) 4. 神经网络模型设计(问题集 <-> 回答集) 5. RNN神经网络 6. 训练 7. 效果验证 1. 训练集 1 Mary moved to the bathroom. 2 John went to the hallway. 3 Where is Mary? bathroom 1 4 Daniel went back to the hallway. 5 Sandra moved

6_for循环搞一个乘法口诀表

/** * * @author NorthernFish * * 思路: * 1 定义三个变量 两国作为因数 一个作为积 然后 用 A*B=C 的形式输出 * 每一行输出的个数由第二个数B控制 * 输出几行用第一个数A控制 * B每次都从1开始自增迭代到A 然后结束本层内循环 * 开始迭代外层循环参数 然后继续进行内循环 * 结果C由A*B相称输出 * */ package _01com.fc.九九乘法表; /** * * @author NorthernFish * * 思路: * 1 定义三

搞一个专属自己的域名邮箱

一.准备 首先你需要有一个属于自己的域名.没有的话们可以去阿里云或者腾讯云去买. 二.注册腾讯企业邮箱 1.打开网站https://exmail.qq.com/onlinesell/intro 2.点击基础班立即开通 3.填写信息 企业名称可以随便填写.个人可以写自己的名字. 4.添加自己的域名.点击已有自己的域名,填写进去 5.设置云解析 三.登陆使用 登陆网址:https://exmail.qq.com/login 添加用户: 剩下的可以自己去摸索. 原文地址:https://www.cnb

【转载】我是一个网卡

转载:我是一个网卡 原创 2016-06-16 刘欣 码农翻身 我出生在深圳的一家工厂,然后飘洋过海来到美国,被安装到一个电脑里, 然后这个电脑又漂洋过海, 被运到了中国.我知道我的使命就是传递信件,但有一个前提:我需要知道对方的地址才行,其实我们网卡都有一个全球唯一的地址,这个地址一出生就确定了,就像你们人类的身份证一样,终生不变. 无论我走到哪里,我都拥有这个唯一的标志:11:27:F5: 8A:79:54 ,  挺长的是吧,你们人类把它叫做MAC地址,  简单起见, 你可以叫我 “TP-L

一个可以直接使用的可用iptables配置的stateless NAT实现

使用iptables配置stateless NAT?我没有搞错.可能你根本不知道这么多NAT的实现细节,或者说根本不在乎,那么本文就当是一个"如何编写iptables模块"的练习了.实际上,我已经实现了一个可以配置stateless NAT的内核模块了,但是它的接口是基于procfs的,并不是说这个接口不好用,而是我觉得如果能集成到iptables就更加perfect了,难道不应该这样吗?有谁能忍受通过iptables和echo的方式配置两种NAT呢?难道不应该在一个iptables

Android:一个高效的UI才是一个拉风的UI(二)

趁今晚老大不在偷偷早下班,所以有时间继续跟大伙扯扯UI设计之痛,也算一个是对上篇<Android:一个高效的UI才是一个拉风的UI(一)>的完整补充吧.写得不好的话大家尽管拍砖~(来!砸死我把~) 前言 前篇博客翻箱倒柜的介绍了优化UI设计的两个方法,第一个就是使用尽量少的组件来实现布局功能,第二个就是使用<meger>标签来减少不必要的根节点,这两个方法都可以提高应用UI的运行效率,但是够了吗?远远是不够的,方法就像money一样永远不嫌多,所以不再介绍多一些UI设计优化的方法说

深入理解Python中协程的应用机制: 使用纯Python来实现一个操作系统吧!!

本文参考:http://www.dabeaz.com/coroutines/   作者:David Beazley 缘起: 本人最近在学习python的协程.偶然发现了David Beazley的coroutine课程,花了几天时间读完后,为了加深理解就把其中个人认为最为精华的部分摘下来并加上个人理解写了本篇博客. 扯一些淡: 既然要搞一个操作系统,那我们就先来设一个目标吧!就像找女朋友,我们不可能随随便便的是个女的就上,肯定要对女方有一定的要求,比如肤白貌美气质佳…… 所以,我们对这个' 姑娘