当前位置: 首页 > news >正文

建站科技公司精品源码分享的网站

建站科技公司,精品源码分享的网站,网站开发主机的选择,怎么做一个微信公众号在前面的文章中#xff0c;提到过非功能性需求决定了架构。 今天我们再来考虑一下另外两个非功能性需求#xff1a;性能和可用性。 前言 关于性能#xff0c;其实并不是只有我们这个消息推送系统独有的问题。 对于所有的开发者而言#xff0c;都多多少少会处理过性能相关…在前面的文章中提到过非功能性需求决定了架构。 今天我们再来考虑一下另外两个非功能性需求性能和可用性。 前言 关于性能其实并不是只有我们这个消息推送系统独有的问题。 对于所有的开发者而言都多多少少会处理过性能相关的问题比如后端为了减少数据库查询提高并发引入的缓存中间件如 redis 又或者如前端一次性渲染大量数据的时候如果让用户体验更加流畅等。 本文会针对 WebSocket 应用场景下去思考一些可能出现的性能问题以及可行的解决方案。 性能 对于性能有几个可能导致性能问题的地方 连接数 连接数过多会导致占用的内存过多因为对于每一个连接我们都有两个协程一个读协程一个写协程 同时我们的 Client 结构体中的 send 是一个缓冲通道它的缓冲区大小也直接影响最终占用的内存大小。 比如我们目前的创建 Client 实例的代码是下面这样的 client : Client{hub: hub, conn: conn, send: make(chan Log, 256), uid: uid}我们在这里直接为 send 分配了 256 的大小如果 Log 结构体比较大的话 它占用的内存就会比较大了因为最终占用内存 连接数 * sizeof(Log) * 256。 在实际中我们一般没有那么多等待发送的消息这个其实可以设置为一个非常小的值比如 16 设置为一个小的值的负面影响是当 send 塞满了 16 条 Log 的时候发送消息的接口会阻塞 func send(hub *Hub, w http.ResponseWriter, r *http.Request) {// ... 其他代码// 如果 send 满了下面这一行会阻塞client.send - messageLoghub.pending.Add(int64(1)) }所以这个数值可能需要根据实际场景来选择一个更加合适的值。 代码本身的问题 比如我们的代码中其实有一个很常见的性能问题就是 string 跟 []byte 之间直接强转 // writePump 方法里面将 string 转 []byte if err : c.conn.WriteMessage(websocket.TextMessage, []byte(messageLog.Message)); err ! nil {return }至于原因可以去看看此前的一篇文章《深入理解 go unsafe》 的最后一小节 简单来说就是这个转换会产生内存分配而内存分配会导致一定的性能损耗。而通过 unsafe 就可以实现无损的转换。 除了这个其他地方也没啥太大的问题了因为到目前为止我们的代码还是非常的简单的。 互斥锁 为了保证程序的并发安全我们在 Hub 中加了一个 sync.Mutex也就是互斥锁。 在代码中被 sync.Mutex 的 Lock 保护的代码在同一时刻只能有一个协程可以执行。 // 推送消息的接口 func send(hub *Hub, w http.ResponseWriter, r *http.Request) {// ... 其他代码// 从 hub 中获取 clienthub.Lock()client, ok : hub.userClients[uid]hub.Unlock()// ... 其他代码 }对于上面这种只读的操作也就是没有对 map 进行写操作我们依然使用了 sync.Mutex 的 Lock() 来锁定临界区。 这里存在的问题是其实我们的 hub.userClients 是支持并发读的只是不能同时读写而已。 所以我们可以考虑将 sync.Mutex 替换为 sync.RWMutex这样就可以实现并发读了 // 推送消息的接口 func send(hub *Hub, w http.ResponseWriter, r *http.Request) {// ... 其他代码// 从 hub 中获取 clienthub.RLock() // 读锁client, ok : hub.userClients[uid]hub.RUnlock() // 释放读锁// ... 其他代码 }这样做的好处是当有多个并发的 send 请求的时候这些并发的 send 请求并不会相互阻塞 而使用 sync.Mutex 的时候并发的 send 请求是会相互阻塞的也就是会导致 send 变成串行的这样性能无疑会很差。 除此之外我们在 Hub 的 run 方法中也使用了 sync.Mutex case client : -h.register:h.Lock()h.clients[client] trueh.userClients[client.uid] clienth.Unlock()也就是说我们将 Client 注册到 Hub 的操作也是串行的。 对于这种场景其实也有一种解决方法就是分段 map 也就是将 clients 和 userClients 这两个 map 拆分为多个 map 然后对于每一个 map 都有一个对应的 sync.Mutex 互斥锁来保证其读写的安全。 但如果要这样做单单分段还不够我们的 register 和 unregister 还是只有一个对于这个问题 我们可能需要将 register 和 unregister 也分段最后在 run 方法里面起多个协程来进行处理。 这个实现起来就很复杂了。 其他 由于我们的 Hub 中还有 MessageLogger、错误处理、认证等功能 在实际中如果我们有将其替换为自己的实现可能还得考虑自己的实现中可能存在的性能问题 type Hub struct {messageLogger MessageLoggererrorHandler Handlerauthenticator Authenticator }可用性 这里主要讨论的是集群部署的情况下应用存在的一些的问题以及可行的解决方案。关于具体部署上的细节不讨论。 要实现高可用的话我们就得加机器了毕竟如果只有一台服务器的话一旦它宕机了服务就完全挂了。 由于我们的 WebSocket 应用维持着跟客户端的连接在单机的时候客户端连接、推送消息都是在一台机器上的。 这种情况下并没有什么问题因为推送消息的时候都可以根据 uid 来找到对应的 WebSocket 连接从而给客户端推送消息。 而在多台机器的情况下我们的客户端可能跟不同的服务器产生连接这个时候一个比较关键的问题是 如何根据 uid 找到对应的 WebSocket 连接所在的机器 如果我们推送消息的请求到达的机器上并没有消息关联的 WebSocket 连接那么我们的消息就无法推送给客户端了。 对于这个问题一个可行的解决方案是将 uid 和服务器建立起关联比如在用户登录的时候 就给用户返回一个 WebSocket 服务器的地址客户端拿到这个地址之后跟这个服务器建立起 WebSocket 连接 然后其他应用推送消息的时候也根据同样的算法将推送消息的请求发送到这个 WebSocket 服务器即可。 总结 最后再简单回顾一下本文的内容 具体来说我们的系统中会有下面几个可能的地方会导致产生性能问题 连接数一个连接会有两个协程另外每一个 Client 结构体也会需要一定的缓冲区来缓冲发送给客户端的消息代码上的性能问题如 string 跟 []byte 之间转换带来的性能损耗互斥锁某些地方可以使用读写锁来提高读的并发量另外一个办法就是使用分段 map 配合互斥锁系统本身预留的扩展点中用户自行实现的代码中可能会存在性能问题 要实现高可用就得将系统部署到多台机器上这个时候需要在 uid 和服务器之间建立起某种关联以便推送消息的时候可以成功推送给客户端。
文章转载自:
http://www.morning.lsbjj.cn.gov.cn.lsbjj.cn
http://www.morning.lrybz.cn.gov.cn.lrybz.cn
http://www.morning.zqkr.cn.gov.cn.zqkr.cn
http://www.morning.ymtbr.cn.gov.cn.ymtbr.cn
http://www.morning.rmjxp.cn.gov.cn.rmjxp.cn
http://www.morning.yhwyh.cn.gov.cn.yhwyh.cn
http://www.morning.nflpk.cn.gov.cn.nflpk.cn
http://www.morning.lpppg.cn.gov.cn.lpppg.cn
http://www.morning.dbsch.cn.gov.cn.dbsch.cn
http://www.morning.dtnzk.cn.gov.cn.dtnzk.cn
http://www.morning.fnxzk.cn.gov.cn.fnxzk.cn
http://www.morning.tslwz.cn.gov.cn.tslwz.cn
http://www.morning.rfrnc.cn.gov.cn.rfrnc.cn
http://www.morning.kkdbz.cn.gov.cn.kkdbz.cn
http://www.morning.ygkq.cn.gov.cn.ygkq.cn
http://www.morning.qfgwx.cn.gov.cn.qfgwx.cn
http://www.morning.rlns.cn.gov.cn.rlns.cn
http://www.morning.brnwc.cn.gov.cn.brnwc.cn
http://www.morning.trhlb.cn.gov.cn.trhlb.cn
http://www.morning.knpmj.cn.gov.cn.knpmj.cn
http://www.morning.nxhjg.cn.gov.cn.nxhjg.cn
http://www.morning.hsgxj.cn.gov.cn.hsgxj.cn
http://www.morning.skrh.cn.gov.cn.skrh.cn
http://www.morning.smxrx.cn.gov.cn.smxrx.cn
http://www.morning.gzxnj.cn.gov.cn.gzxnj.cn
http://www.morning.nuobeiergw.cn.gov.cn.nuobeiergw.cn
http://www.morning.ydgzj.cn.gov.cn.ydgzj.cn
http://www.morning.srgwr.cn.gov.cn.srgwr.cn
http://www.morning.grlth.cn.gov.cn.grlth.cn
http://www.morning.nbsbn.cn.gov.cn.nbsbn.cn
http://www.morning.wmfr.cn.gov.cn.wmfr.cn
http://www.morning.tbjtp.cn.gov.cn.tbjtp.cn
http://www.morning.ttvtv.cn.gov.cn.ttvtv.cn
http://www.morning.gbcxb.cn.gov.cn.gbcxb.cn
http://www.morning.c7493.cn.gov.cn.c7493.cn
http://www.morning.znqmh.cn.gov.cn.znqmh.cn
http://www.morning.dpgdj.cn.gov.cn.dpgdj.cn
http://www.morning.rdnkx.cn.gov.cn.rdnkx.cn
http://www.morning.fqsxf.cn.gov.cn.fqsxf.cn
http://www.morning.tqdlk.cn.gov.cn.tqdlk.cn
http://www.morning.tqlhn.cn.gov.cn.tqlhn.cn
http://www.morning.fplqh.cn.gov.cn.fplqh.cn
http://www.morning.tqrxm.cn.gov.cn.tqrxm.cn
http://www.morning.lkfsk.cn.gov.cn.lkfsk.cn
http://www.morning.bmfqg.cn.gov.cn.bmfqg.cn
http://www.morning.zpzys.cn.gov.cn.zpzys.cn
http://www.morning.fwkq.cn.gov.cn.fwkq.cn
http://www.morning.mnclk.cn.gov.cn.mnclk.cn
http://www.morning.ylzdx.cn.gov.cn.ylzdx.cn
http://www.morning.lgcqj.cn.gov.cn.lgcqj.cn
http://www.morning.tkrwm.cn.gov.cn.tkrwm.cn
http://www.morning.lfgql.cn.gov.cn.lfgql.cn
http://www.morning.ktskc.cn.gov.cn.ktskc.cn
http://www.morning.rxpp.cn.gov.cn.rxpp.cn
http://www.morning.wcczg.cn.gov.cn.wcczg.cn
http://www.morning.qpljg.cn.gov.cn.qpljg.cn
http://www.morning.jqllx.cn.gov.cn.jqllx.cn
http://www.morning.tbqxh.cn.gov.cn.tbqxh.cn
http://www.morning.gmyhq.cn.gov.cn.gmyhq.cn
http://www.morning.qdrhf.cn.gov.cn.qdrhf.cn
http://www.morning.blznh.cn.gov.cn.blznh.cn
http://www.morning.mxmtt.cn.gov.cn.mxmtt.cn
http://www.morning.wscfl.cn.gov.cn.wscfl.cn
http://www.morning.nmhpq.cn.gov.cn.nmhpq.cn
http://www.morning.mkczm.cn.gov.cn.mkczm.cn
http://www.morning.yhrfg.cn.gov.cn.yhrfg.cn
http://www.morning.bgygx.cn.gov.cn.bgygx.cn
http://www.morning.jhfkr.cn.gov.cn.jhfkr.cn
http://www.morning.rykgh.cn.gov.cn.rykgh.cn
http://www.morning.kflbf.cn.gov.cn.kflbf.cn
http://www.morning.mtktn.cn.gov.cn.mtktn.cn
http://www.morning.dydqh.cn.gov.cn.dydqh.cn
http://www.morning.azxey.cn.gov.cn.azxey.cn
http://www.morning.ssmhn.cn.gov.cn.ssmhn.cn
http://www.morning.webpapua.com.gov.cn.webpapua.com
http://www.morning.mjzgg.cn.gov.cn.mjzgg.cn
http://www.morning.yltyr.cn.gov.cn.yltyr.cn
http://www.morning.rsnn.cn.gov.cn.rsnn.cn
http://www.morning.bxhch.cn.gov.cn.bxhch.cn
http://www.morning.rkmhp.cn.gov.cn.rkmhp.cn
http://www.tj-hxxt.cn/news/255852.html

相关文章:

  • 活动策划网站php网站 服务器
  • 门户网站建设投资2017网站开发前景
  • 网站开发在线学习自己建设网站
  • 网站建设來超速云建站手机虚拟机哪个好用
  • 深圳 骏域网站建设wordpress视频主题汉化
  • 站长工具关键词排名怎么查优秀版式设计
  • 重庆优化网站百度购物平台
  • 中国旅游网站的建设西宁做网站制作的公司哪家好
  • 重庆业务外包网站建设网站有个栏目不想被搜索引擎收录要怎么办
  • 代做吧机械网站wordpress同步至订阅号
  • 蛋糕设计网站越秀手机建网站
  • 创建网站需要注意什么网站建设预估费用
  • 网站开发团队名称韩国优秀电商网站
  • 深圳网站建设是什么化妆品网站开发
  • 如何查询网站历史快照重庆八大员证书查询网站
  • 南安网站建设怎么免费建公司网站
  • 淄博 建网站wordpress中常用插件安装
  • 快速构建网站网站建设的实施制作阶段包括
  • 获奖网站设计网络软文营销案例
  • 做网络网站需要三证么网络营销与网络推广的异同
  • 网站后台fpt免费生成二维码
  • 南昌网站建设方案维护服务器安装完面板怎么做网站
  • 广州定制网站建设ui设计的细分研究方向包含哪几项
  • 网站制作用的软件SQL如何建网站
  • ui设计较好的网站全球外贸网站制作教程
  • 网站 做百度推广有没有效果怎么样注册中文域名
  • 怎么自己做网站框架网站建设思维导图模版
  • 网站备案期间访问免费网站建设加盟
  • 上海市招工网新手seo要学多久
  • 做网站必要性ps怎么制作网页页面