内容简介:pushy
前言(待整理)
relayrides/pushy 是一个 Java library for sending APNs (iOS, OS X, and Safari) push notifications. 揉和了netty和http2协议。因此,除了它本身的功能外,从中也可以学到许多对netty框架以及http2协议的使用技巧。
对外接口
ApnsPayloadBuilder payloadBuilder = new ApnsPayloadBuilder(); payloadBuilder.setAlertBody("Example!"); String payload = payloadBuilder.buildWithDefaultMaximumLength(); String token = TokenUtil.sanitizeTokenString("<efc7492 bdbd8209>"); SimpleApnsPushNotification pushNotification = new SimpleApnsPushNotification(token, "com.example.myApp", payload); Future<PushNotificationResponse<SimpleApnsPushNotification>> sendNotificationFuture = apnsClient.sendNotification(pushNotification);
从pushy中学到的
既写又读的handler
一般框架Client,通过一个id关联request和response(通过future来获取),这个future要在多个类之间传递。
class Client{ Map<id,future> map; Future<Response> send(request){ future = new xxx; map.put(id,future); channel.write(request).addListener(new xx{ onComplete(){ xxx future.set(xx) } }); return future; } } class ReceiveHandler{ Map<id,future> map; onDataReceive(response){ future = map.get(response.getId()); future.set(xx) } }
而pushy则是
class ApnsClient{ Future<Response> send(request){ future = new xx(); channel.write(new Composite(request,future)); return future; } } ApnsClientHandler{ Map<id,future> map; write(composite){ request = composite.getRequest() future = composite.getFuture(); map.put(id,future) write(request).addListener(){ future.set(xx) } } onDataReceive(response){ future = map.get(response.getId()); future.set(xx); } }
从代码上讲,write和receive都写在一个类里(这里是),因为write和read要共享很多数据,这些数据作为ApnsClientHandler的成员,代码上就可以更紧凑。
future/promise的转换
这个其实也不是什么技巧,promise是可写的future。
Future operation1(){ Promise promise = xx xxFuture future2 = operation2(); future2.addListener(new xxListener(){ onComplete(){ promise.setxx } }); return promise; }
在本例中,future2并不能直接返回,需要转换成promise(具体的说,通过future2的listener为promise赋值,这也是future/promise这里异步组件特有的转换方式)。一个常见的场景,返回的future要承载某个model,但在获取model之前有几个前置条件
- write success,当发送缓冲区拥堵、网络断开时,会write fail
- read response success
- 如果future承载的model和response model不是一回事,还要根据业务进行语义的转化,这一步也要确保success
也就是说,一个异步操作的结果,可能是多个异步操作结果的叠加。在更复杂的例子中,要为operation2传入promise,介入更深层次的异步操作。可以使用netty的 io.netty.util.concurrent.PromiseCombiner
来简化一些叠加操作。
操作接口
netty对外提供的操作接口有以下几个问题,当然,这也不怨netty
- 操作对象有多个,比如bootstrap、channel。并且,操作对象间存在依赖关系,channel不是直接初始化,而是通过bootstrap获得。
-
启动逻辑复杂,必须由用户显式编写代码。有的框架本身仅仅业务逻辑,故无需启动(显式调用构造函数、或执行
xx.start()
),比如fastjson。有的本身用到了线程,故需显式启动,比如common-pool。但common-pool的启动逻辑非常简单,netty则较为复杂 -
操作接口不简洁,对于io操作,简介的接口应该是
-
同步,
response send(request)
-
异步,
Future<response> send(request)
而netty则无明确封装
-
同步,
维护多次请求的上下文(未完成)
对于client,大部分协议只要求一次请求和响应。而对于http2洗衣,因为使用了 netty-codec-http2
的关系,至少在代码上,
数据的发送分为header和data,那么在header和data之间,便需要维护上下文
其它
当我们有一个新的协议
- 像pushy一样,http2协议独立于netty(如何基于netty独立的实现第三方协议,以及这个协议与netty的结合方式),pushy + http2 + netty 组合
- 像zk等一样,将netty 作为一个transport层。
model | 编解码 | ||
---|---|---|---|
业务层 | 业务model | 继承message,实现encode、decode | 调用transport层提供的send接口 |
transport层 | message | 抽象方法 encode、decode | transport 只是实现message的交互 |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
算法艺术与信息学竞赛
刘汝佳 / 清华大学出版社 / 2004-1 / 45.00元
《算法艺术与信息学竞赛》较为系统和全面地介绍了算法学最基本的知识。这些知识和技巧既是高等院校“算法与数据结构”课程的主要内容,也是国际青少年信息学奥林匹克(IOI)竞赛和ACM/ICPC国际大学生程序设计竞赛中所需要的。书中分析了相当数量的问题。 本书共3章。第1章介绍算法与数据结构;第2章介绍数学知识和方法;第3章介绍计算机几何。全书内容丰富,分析透彻,启发性强,既适合读者自学,也适合于课......一起来看看 《算法艺术与信息学竞赛》 这本书的介绍吧!