liveshow回顾
在2017年8月14号的一天接到一个即看即买的项目,大致功能如下
1.现场走秀直播同步到H5页面
2.实时显示直播间人数
3.点赞并实时显示给用户
4.在某个时间点,可以全体推送一些消息给所有用户
5.推送的消息里面的商品可以点击购买,加入购物车。
6.实时聊天,获取用户真实的昵称,头像(基于微信授权)
7.保存聊天记录,用户在进来后显示最后十条聊天记录
约定29号上线,当时准备采取用workman+mysql的方式来处理这些功能,大约有12个工作日来开发,但是其中因为中间穿插了一个另外的项目花去了四天时间,然后客户临时要求加个RSVP的功能花去一天,最后只剩下了7个工作日来开发这个这个项目,包括前端和后端的整合。因为客户希望在直播的时候推出他们的产品,所以不希望直播全屏,那样会使用户看不到商品,前端解决这个问题加上做完这些页面,总共花了三天时间,我只剩了四天时间。因为时间很紧迫,没有考虑这些设计的合理性,包括上线的峰值和并发都没有进行估算,结果出现了大家预想中的事情,服务器宕机。
主要表现:
1.上线10分钟左右,因为直播还没有接入,很多用户在公屏发言,而当时用户的昵称、头像都是保存在数据库的,需要从数据库读取,并且聊天记录要写入数据库。大量的I/O操作,导致mysql内存耗尽,直接mysql gone away了。
2.在大约八点半左右的时候,一位明星的登场走秀,导致直播间人数暴增,在几分钟之内服务器就挂掉了,白屏了大约一分钟。
处理方案:
1.第一次数据库挂掉之后,及时的发现了原因,删除掉了聊天记录的写入之后重启了数据库
2.在apache挂掉之后,查看服务器发现cpu达到96%,内存耗尽所以挂掉,赶紧重启
在直播结束之后,我们向服务器公司要了一份当天直播时候的报告:




通过上面图标我们可以发现问题,就是服务器过载了,主要两个原因
1.实时聊天购物用的是workman,每进入一个人都会建立一个tcp连接,瞬间涌入的人太多导致连接池满载
2.峰值很高,系统已经发生任务拥塞,Apache和Mysql同时连接内存开销太大,服务器配置是4G内存,4CPU,进程太多不够使用然后消耗系统内存导致服务挂掉
当时服务器挂掉的原因固然是因为服务器配置不高的原因,但是工具选取不对也是很大的因素,后来想了解决方案:
1 .增加服务器的配置(内存和CPU),或者搭建一个简单的负载均衡系统避免一台机器宕机,整个服务停掉
2.瞬间涌入人太多的项目要在项目开始前估算峰值,选择服务器
3.临时修改Apache的最大连接数,满足项目的要求
4.数据存储改成两层数据存储,用nosql+mysql的方式,在半夜服务器活动少的时候同步数据
第二天的时候赶紧花了半天的时候,将所有的操作从操作数据库改成了操作redis,redis可以支撑7-10W的并发,比数据库的性能要好很多,将所有的数据存入redis中,在直播的时候直接操作redis。等到直播结束或者服务器闲置的时候,定时执行脚本将数据同步至mysql,查询的时候先查缓存再查数据库。这样可以很大的避免数据库挂掉,服务器崩溃的情况。

在改成redis存储之后,整个代码量减少了大约三分之二,并且redis的操作是原子性的,对于一些递增递减的操作支持很好,不像MYSQL一样,一旦递增递减update之后就会锁定表,阻塞后面的操作,导致mysql挂掉。

liveshow回顾的更多相关文章
- [C#] C# 基础回顾 - 匿名方法
C# 基础回顾 - 匿名方法 目录 简介 匿名方法的参数使用范围 委托示例 简介 在 C# 2.0 之前的版本中,我们创建委托的唯一形式 -- 命名方法. 而 C# 2.0 -- 引进了匿名方法,在 ...
- SQL Server-表表达式基础回顾(二十四)
前言 从这一节开始我们开始进入表表达式章节的学习,Microsoft SQL Server支持4种类型的表表达式:派生表.公用表表达式(CTE).视图.内嵌表值函数(TVF).简短的内容,深入的理解, ...
- [C#] C# 知识回顾 - 你真的懂异常(Exception)吗?
你真的懂异常(Exception)吗? 目录 异常介绍 异常的特点 怎样使用异常 处理异常的 try-catch-finally 捕获异常的 Catch 块 释放资源的 Finally 块 一.异常介 ...
- [C#] C# 知识回顾 - 学会处理异常
学会处理异常 你可以使用 try 块来对你觉得可能会出现异常的代码进行分区. 其中,与之关联的 catch 块可用于处理任何异常情况. 一个包含代码的 finally 块,无论 try 块中是否在运行 ...
- [C#] C# 知识回顾 - 学会使用异常
学会使用异常 在 C# 中,程序中在运行时出现的错误,会不断在程序中进行传播,这种机制称为“异常”. 异常通常由错误的代码引发,并由能够更正错误的代码进行 catch. 异常可由 .NET 的 CLR ...
- [C#] C# 知识回顾 - 异常介绍
异常介绍 我们平时在写程序时,无意中(或技术不够),而导致程序运行时出现意外(或异常),对于这个问题, C# 有专门的异常处理程序. 异常处理所涉及到的关键字有 try.catch 和 finally ...
- [.NET] C# 知识回顾 - Event 事件
C# 知识回顾 - Event 事件 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6060297.html 序 昨天,通过<C# 知识回顾 - ...
- [.NET] C# 知识回顾 - 事件入门
C# 知识回顾 - 事件入门 [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6057301.html 序 之前通过<C# 知识回顾 - 委托 de ...
- [.NET] C# 知识回顾 - 委托 delegate (续)
C# 知识回顾 - 委托 delegate (续) [博主]反骨仔 [原文]http://www.cnblogs.com/liqingwen/p/6046171.html 序 上篇<C# 知识回 ...
随机推荐
- Ajax 请求后打开新窗口被拦截的解决方案
公司业务上有个场景,需请求后台获取支付链接地址,再打开地址引导用户购买.这样的场景在其他企业应该也很场景.但是遇到个很常见的问题,Ajax后直接用window.open(url),会被浏览器作为广告拦 ...
- 自学Python4.1-文件操作
文件操作 操作文件时,一般需要经历如下步骤: 打开文件 操作文件 关闭文件(非必须) 一.打开文件 open('文件路径', '模式') 打开文件时,需要指定文件路径和以何等方式打开文件,打 ...
- gradle发布jar包
在.gradle文件中添加以下代码 apply plugin: 'application' mainClassName = 'com.excel.ExcelApplication' jar { doF ...
- json的那些事
1.什么是json? json(javascript object notation)全称是javascript对象表示法,它是一种数据交换的文本格式,而不是一种编程语言,用于读取结构化数据.简单来说 ...
- redis集群配置,spring整合jedis,缓存同步
前台的商品数据(图片等加载缓慢)查询,先从redis缓存查询数据. redis是一个nosql数据库,内存版数据库,读取速度11w/s.本身具有内存淘汰机制,是单线程服务器(分时操作系统),线程安全. ...
- NoSQL数据库
NoSQL数据库 1.NoSQL简介 最初表示"反SQL"运动,用新型的非关系型数据库取代关系数据库:现在表示"Not only SQL"关系和非关系型数据库各 ...
- xamarin android alertdialog详解
说明一下:学习xamarin android一段时间,准备写一些xamarin android相关的例子,alertdialog也是使用的非常多得空间之一,非常感谢鸟巢上的小猪,我也是看着他写的教程学 ...
- bat获取系统时间修改系统密码
@echo off %1 mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe&q ...
- java 实现的c当中的几道题
package javastudy; /* * 利用条件运算符的嵌套来完成此题:学习成绩>=90分的同学用A表示,60-89分之间的用B表示, 60分以下的用C表示. */ import jav ...
- springBoot系列教程07:异常捕获
发生异常是很正常的事,异常种类也是千奇百怪,发生异常并不可怕,只要正确的处理,并正确的返回错误信息并无大碍,如果不进行捕获或者处理,分分钟服务器宕机是很正常的事 所以处理异常时,最基本的要求就是发生异 ...