Computer Theory

对服务端推送(Server Push)比较好的解释

摘自: http://www.javaworld.com/javaworld/jw-02-2009/jw-02-servlet3.html?page=2 Service streaming (streaming) allows a server to send a message to a client when an event occurs, without an explicit request from the client. In real-world implementations, the client initiates a connection to the server through a request, and the response returns bits and pieces each time a server-side event occurs; the response …

对服务端推送(Server Push)比较好的解释 Read More »

websocket的握手与数据传输

关于握手,转一张 图: 连接建立后,客户端和服务端就可以 全双工地通迅。 数据传输以"message"为单位. 一个message由一个或多个frame组成,每个frame等于一个 header + payload.

关于comet、websocket的比较

首先要明白websocket不是http协议,只不过有些相似的地方: 报文格式相似(但不相同),都被浏览器支持,服务商品都是80等。 而comet是基于http协议的. 再推荐一篇文章,里面总结了websocket相比于comet在性能方面的优点: Ajax、Comet、HTML 5 Web Sockets技术比较分析

Stream-based Transport

普通的传输是指发送方会在发完一条逻辑消息后,显式地发一个end of stream标识,在接收方眼里,一条消息就是一个packet. 而在Stream-based Transport中,发送方不发送end of stream标识,而只是不停地发字节,接收方需要按照预定义的报文协议自己组合byte,解析出逻辑消息。

避免死锁的一招: 按同样的顺序加锁

当进程A正在把钱从甲账户转到乙账户时,进程B也正在把钱从乙账户到甲账户;转账时需要锁住账户,如果A锁住甲等待乙时,B已锁住乙并等待甲,那么双方就会陷入死锁。 要避免这种死锁,有一个办法是: 按同样的顺序加锁。 注意,读书不要读得太快。 听说“按同样顺序加锁”就能避免死锁,就总是先锁出账者,再锁入账者。。。 结果,还是死锁。 “按同样的顺序加锁”不是指“两个进程使用同样的操作顺序(比如先锁出账者,再锁入账者)”,而是要“对给定的两个资源,所有进程总是先锁资源1,再锁资源2”。 比如,在数据库中,可以总是先锁ID更大的那条记录;在JAVA代码中,可以总是先锁hashcode更大的那条记录。

活锁(livelock)

活锁(livelock): 没有真正的锁问题,而是进程不停地执行重复的操作,却总是失败。 《JAVA并发编程实践》给出了两个例子: 1. MQ消费者处理消息失败后将消息丢回到队列头部,然后立即马上收到这个消息,然后再处理失败入。。。 2. 两个礼貌的人在路上挡住彼此去路,然后同时往一边让,结果还是互相挡住;然后在同时往另一边让,结果也是互相挡住;然后再往一边让。。。 解决活锁的办法是在操作中引入退出机制,或者引入随机性。