码迷,mamicode.com
首页 > Web开发 > 详细

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

时间:2016-01-23 00:51:29      阅读:525      评论:0      收藏:0      [点我收藏+]

标签:

 

苹果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取到了,就不能再发回去了,其实应该发回去重试
先考虑机制,数据结构正确了,策略很简单
*/

 

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

标签:

原文地址:http://www.cnblogs.com/wardenlym/p/5152367.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!