异步通信与事件分发框架
2016-03-30 12:07
253 查看
本文的潜在读者是五年以下经验的程序员,五年以上的资深工程师请绕道。
如果读者有需求,本文回复超过十个类似需求,我会整理一套开源的开发框架,含python/c++的socket服务器端/客户端代码,Java/oc的socket客户端外加事件分发以及sample。这样的框架github上有,但是我感觉现有的开源的都不是我理想中的(简洁易懂)。
我们非常常见的一种业务需求是客户端和服务端通信。注意这里的措辞,是客户端和服务端通信,在服务器集群中,服务器本身也可以是客户端。然而这里不想讨论分布式的结构。我们以APP为例子。
这个需求非常常见,但是大多数没有架构设计的小团队都会做的非常糟糕,通信想怎么写就怎么写,一个原生socket写下来,后面全乱套了。服务端的同僚N多时候也只关注自己的一亩三分地。导致整个项目的结构杂乱无章。
实际上,异步通信通常都会自建一套消息分发机制。为了更好的梳理场景,我们先看看同步的(阻塞)的通信的处理流程,如下图。
通常APP开发人员都知道这种同步IO的场景。不涉及多线程和回调等不那么直白的结构。
可惜,很多业务都需要维持长时间的通信(TCP/UDP)。因为要长时间的接收服务器推送的消息。例如要实现新闻APP的自动更新新闻列表。对这个需求还有比较折中的办法来实现。
折中总是有代价的,代价就是数据流量的损耗。有些新闻APP的数据流量惊人,一天可以跑几百MB,估计每隔一分钟就去服务器爬一次最新的新闻列表。
另外一些则必须要一个服务器通知APP的机制。例如IM消息,用户A保不准哪会会给用户B发一个消息。如果还这样去刷http,恐怕是非常不理想的方式。
这里牵涉到回调函数,多线程等几个方面。简单的用一个活动图来表述一下我说的流程吧。
需要注意几个地方。
一、PDU需要含一个seq_id,这是客户端用来分发主动请求的内容的回调事件的派发机制的索引id。
二、hashmap需要注意线程安全。----这个如果不处理,程序肯定会有问题。
三、callback的实现。Java通常用类似interface这类东西实现。C/C++则是函数指针。
如果读者有需求,本文回复超过十个类似需求,我会整理一套开源的开发框架,含python/c++的socket服务器端/客户端代码,Java/oc的socket客户端外加事件分发以及sample。这样的框架github上有,但是我感觉现有的开源的都不是我理想中的(简洁易懂)。
我们非常常见的一种业务需求是客户端和服务端通信。注意这里的措辞,是客户端和服务端通信,在服务器集群中,服务器本身也可以是客户端。然而这里不想讨论分布式的结构。我们以APP为例子。
这个需求非常常见,但是大多数没有架构设计的小团队都会做的非常糟糕,通信想怎么写就怎么写,一个原生socket写下来,后面全乱套了。服务端的同僚N多时候也只关注自己的一亩三分地。导致整个项目的结构杂乱无章。
实际上,异步通信通常都会自建一套消息分发机制。为了更好的梳理场景,我们先看看同步的(阻塞)的通信的处理流程,如下图。
通常APP开发人员都知道这种同步IO的场景。不涉及多线程和回调等不那么直白的结构。
可惜,很多业务都需要维持长时间的通信(TCP/UDP)。因为要长时间的接收服务器推送的消息。例如要实现新闻APP的自动更新新闻列表。对这个需求还有比较折中的办法来实现。
折中总是有代价的,代价就是数据流量的损耗。有些新闻APP的数据流量惊人,一天可以跑几百MB,估计每隔一分钟就去服务器爬一次最新的新闻列表。
另外一些则必须要一个服务器通知APP的机制。例如IM消息,用户A保不准哪会会给用户B发一个消息。如果还这样去刷http,恐怕是非常不理想的方式。
这里牵涉到回调函数,多线程等几个方面。简单的用一个活动图来表述一下我说的流程吧。
需要注意几个地方。
一、PDU需要含一个seq_id,这是客户端用来分发主动请求的内容的回调事件的派发机制的索引id。
二、hashmap需要注意线程安全。----这个如果不处理,程序肯定会有问题。
三、callback的实现。Java通常用类似interface这类东西实现。C/C++则是函数指针。
相关文章推荐
- 测试MySQL性能的几款工具
- mAppWidget - 1. 初试mAppWidget:下载、运行、测试
- 疯子求助-梧桐雨解答的jsp proxy
- python学习4:获取豆瓣上映电影数据
- JVM调优经验分享
- JVM调优经验分享
- OpenGL立方体在世界坐标系中_缩放_旋转_平移_顶点片源着色器
- 课程练习一Problem F
- 并发编程经历:同步加锁之业务锁
- squid源码分析2—refresh_pattern机制分析
- 第一次面试实习生经历
- 隐藏导航栏最底下的线条
- 什么是环境变量?道理在这四个故事中
- 2016.3.29 360c++ 研发编程第一题
- 为MySQL选择合适的备份方式
- sntp使用
- java学习笔记(四)
- 超级有用的9个PHP代码片段
- jQuery 效果 - 动画
- [maven] settings 文件节点配置详解