Browse Month: 九月 2016

高并发系统

高并发系统实例两则

大话程序猿眼里的高并发

高并发业务功能实例

签到功能,抽奖

需求: 签到功能,一天一个用户只能签到一次,签到成功后用户获取到一个积分。

数据库表: 用户表,包含积分字段

高并发问题: 在高并发的情况下,一个用户签到记录会有多条,或者用户签到后不止加一次积分。

设计:

首先根据需求我会添加一张签到记录表,这张表把用户唯一标识字段(ID,Token)和签到日期字段添加为唯一约束,这样就可以防止并发的时候插入重复用户的签到记录。然后再程序代码逻辑里,先执行签到数据的添加(这里可以防止并发,添加成功后再进行积分的添加,这样就可以防止重复的添加积分了。最后我还是建议所有的数据操作都写在一个sql事务里面, 这样在添加失败,或者编辑用户积分失败的时候可以回滚数据。

特点:

使用数据库事务,在前一个操作一定完成的情况下,在操作后面的逻辑。操作完成后解除数据库锁。

改进设计: 使用Redis 设置唯一锁。

Redis setNx: 如果设置的值不存在,就设置该值并返回true; 如果需要设置的值存在,则不会修改原值,并且返回false。

首先通过 setnx,以日期为键,用户ID 为值,获取唯一锁,然后往积分表里面插入数据。


大话程序猿眼里的高并发架构

高并发架构

架构

三级处理,三级缓存

APP 端缓存

CDN 静态资源缓存

服务端负载均衡

前端机缓存

缓存集群

数据库集群

消息队列处理异步消息

  1. 当用户参与活动(红包,抢购),将用户参与信息push到队列中
  2. 然后写个多线程pop数据,进行发放红包的业务
  3. 将活动结果推送给用户, 或者引导用户获取结果
  4. 这样可以支持高并发下的用户可以正常的参与活动,并且避免数据库服务器宕机的危险

SSH 协议与使用

SSH一种网络协议,用于计算机的加密登录,用避免被中途截获泄漏密码。

OpenSSH是 SSH的一种实现

基本用法

使用ssh连接远程机器的22号端口(默认端口)

SSH协议过程

  1. 远程主机收到用户的登录请求,把自己的公钥发给用户
  2. 用户使用这个公钥,将登录密码加密后,发送回来
  3. 远程主机用自己的私钥,解密登录密码,如果密码正确,就同意用户登录

存在问题:中间人攻击

如果有人截获了登录请求,然后冒充远程主机,将伪造的公钥发给用户,那么用户很难辨别真伪。

解决中间人问题

第一次登陆时提示

用户自行确认该公钥指纹,将检验过的公钥保存在/etc/ssh/ssh_known_hosts

公钥登陆

用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求密码

生成公秘钥对

$ ssh-keygen

公秘钥文件保存在 $HOME/.ssh/ 目录

上传公钥

$ ssh-copy-id user@host

无效时检查

远程服务器 /etc/ssh/sshd_config ,去掉注释

重启远程主机 ssh服务 service ssh restart

authorized_keys

用户的公钥,保存在远程主机登录后的用户主目录的$HOME/.ssh/authorized_keys文件中

公钥是authorized_keys文件末尾的一段字符串

ssh登录

配置文件

~/.ssh/config

连接共享

快速登录配置

$ ssh d(tab) 实现自动补全

秘钥登录

将本地.ssh/keyfile.pub 拷贝到远端.ssh/authorized_keys,设置文件权限为600

添加配置IdentityFile ~/.ssh/keyfile.pub

注意清除known_hosts记录

参考