swoole学习第七讲(学习swoole需要掌握的知识)

2019-02-15  本文已影响20人  sowork
轮询、长轮询、长连接、单工、全双工、半双工区别
socket、websocket、http之间的关系
TCP/IP分层模型
差异 websocket http
数据传输方式 双工 单工
消息模式 request/response bi-direction(双向)
服务器推技术 天生不支持
依靠长轮询或流技术实现
默认支持
开销 每个请求开销适中 建立连接开销适中
后续发送消息最小化开销
连接方式 长连接(协议本身实现) http1.0短连接/http1.1长连接
利用的是tcp/ip层面实现的长连接)
媒介/优势 缓存 不可能支持 核心特性
基于协议 TCP/IP TCP/IP
通信模型 socket socket
协议层次 应用层协议 应用层协议
可靠性 可靠 可靠
依赖关系 依赖http协议
靠http头转换为websocket协议
不依赖
适用场景 实时性高 不需要实施更新/高度可缓存
支持范围 广泛支持 现代语言、客户端
http/websocket 它们之间的关系

更多场景参考:https://cs.xieyonghui.com/architecture/65.html

并行、并发、同步、异步、阻塞、非阻塞、进程、线程、CPU核心之间的关系

阻塞/非阻塞侧重说明IO过程中进程的状态,同步/异步侧重说IO完成后进程获取结果的一个方式

办港台通行证可以去出入境大厅办,也可以在网上办,办完后直接寄给你。

  • 异步IO(网上办):网上填好资料,其他的你就不用管了,该干嘛干嘛。直到收到通行证。OK,你现在可以去香港澳门嗨了。
  • 大厅办,又可以分两种情况:
  • 阻塞IO(排队等候):在排队的过程中你不能跑去做其他事情了吧。直到排到你了,你就和办证的美女姐姐完成办证过程,这个过程你也是离开不了。
  • 非阻塞IO(叫号等候):人民政府觉得办证要人性化,所以采用了叫号机制。你拿了号以后,可以在大厅中呆着时不时看看大屏幕是不是排到你了,或者出去抽根烟逛个街看个美女,再回来看看是不是排到你了。直到排到你了,你就需要到窗口完成办证过程了。
  • IO多路复用(雇人排队): 假设有一个人只要给他钱,他就可以拿着你的号替你排队,但是办证过程需要你本人。所以排到你的号了,他就打个电话叫你回来办。这样你就可以同时帮你爸妈三姑六婆等等办通行证一起办了。这就是IO多路复用了,你街也逛得爽了,美女也看够了,还能同时办多个通行证,这过程简直爽呆。但就是需要另外付给号阪机构钱,开销比自己排队多了。
  • 所以上面几种方式中,异步IO最省事,IO多路复用也挺好用的,只不过多了一次系统调用的(select/poll/epoll)开销。
  • 详细参考https://blog.csdn.net/historyasamirror/article/details/5778378
为什么有HttpServer、WebSocketServer、TcpServer、UdpServer,它们之间的关系是什么,该选择什么?

HttpServer:应用层协议,对传输层协议在封装,遵循http协议
WebSocketServer: 应用层协议,对传输层协议在封装,基于http协议,遵循websocket协议
TcpServer 传输层协议
UdpServer: 传输层协议
如下图,顶层为应用层,中间通过socket抽象层关联到传输层

总结:Http/websocket协议是基于传输层tcp/udp协议实现的传输层协议,更加方便开发人员使用,应用层协议能实现的,通过传输层协议也能实现,在以快速实现功能的前提下,当让挑最简单的来使用了,如果你不想加班的话。同理,这些server是相应协议的实现,websocket支持长连接,http不支持长连接,根据对应的业务选择相应的server

  • 举个例子
    TCP实现了Socket接口,而TCP是面向stream传输的,直接用Socket容易出问题,比如粘包问题。WebSocket是一个应用层协议,更抽象,不需要考虑这些问题。所以当然可以直接用Socket实现长连接,不过仍然需要实现自己的上层协议来处理分包,比较麻烦,不如直接用WebSocket。自己的客户端使用自己的私有协议还行,但浏览器的话更需要一个统一的应用层协议,所以WebSocket就出现了。
IO/CPU之间的关系

总结:在涉及到IO操作时,CPU是只管发IO指令的,具体的读取、并将读到的信息处理是硬盘自己自己来实现的,DMA是跑腿的

协程

众所周知swoole和go都实现了协程,但是两者之间还是有些不同的,详见swoole官网介绍 https://wiki.swoole.com/wiki/version/?id=1018&version=5

在编程中,会遇到IO密集型和CPU密集型这两种情况
swoole为什么线程安全:swoole一个进程下同时只有一个线程在执行任务,当任务类型为CPU密集型时,因为只有一个线程,所以在操作堆(heap)数据时不需要使用锁,go语言时多线程,操作堆(heap)数据时多个线程需要加锁,由于swoole设计的原因,所以时线程安全的,但是执行IO密集操作这又是另一回事了,需要为了保证数据的一致性,还是要加锁,比如数据库的行锁等。

上一篇下一篇

猜你喜欢

热点阅读