异步通信与事件分发框架

来源:互联网 发布:淘宝的优惠券怎么发放 编辑:程序博客网 时间:2024/05/24 05:42

本文的潜在读者是五年以下经验的程序员,五年以上的资深工程师请绕道。

如果读者有需求,本文回复超过十个类似需求,我会整理一套开源的开发框架,含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++则是函数指针。



0 0
原创粉丝点击