Rate Limit 限流

Submitted by Lizhe on Tue, 07/25/2017 - 12:22

如果你还记得12306网站那个著名的 "系统太忙请稍后再试"你一定遇到过限流

或者是jd的抢购活动的"服务器太忙请稍后再试" 都是限流的结果

限流的好处在于防止非预期的请求对系统压力过大而引起的系统崩溃

一般Web系统的访问限制都可以用容器本身来实现,比如tomcat就可以在connector上面配置connection数目的限制,servlet thread限制

不过如果不同的URL需要配置不同的限制, tomcat显然是做不到的

这个时候就需要实现自己的限制

 

常用的限流算法有两种   漏桶算法和令牌桶算法

 漏桶算法

请求会先进入一个漏桶里, 假设漏桶每分钟滴4滴水, 那么就有4个请求在这一分钟里被处理,如果水桶满了, 就意味着可以goto error page 了

Spring Session ( by tomcat directly )

Submitted by Lizhe on Tue, 07/25/2017 - 10:13

换成tomcat下工作的版本需要

添加一个filter在web.xml里

pom.xml的依赖需要一些改动,其他都差不多

这里唯一需要稍微解释一下的是filter使用的springSessionRepositoryFilter, 这个对象的名字是约定的,也就是说没有特殊需要不要随意修改

另外这个对象是@EnableRedisHttpSession标签自动生成的,如果移除标签,会得到找不到springSessionRepositoryFilter对象的错误 ( 又是一个找不到对象的错误 :P )

/springsessionsampletomcat/pom.xml

Spring Session ( by spring boot )

Submitted by Lizhe on Mon, 07/24/2017 - 14:09

以前做tomcat集群的时候你一定处理过session共享的问题

原理一般都是使用memcached和redis当做缓存,然后把session数据直接存进去

做法是使用一个特定的memcached或者redis的session管理器, 一般来说这个管理器只能在特定的容器中使用

也就是说存储媒介是memcached或者redis, 实现是通过session管理器

spring session 其实也差不多, 也是把session存进memcached或者redis, 只不过它是通过一个filter来实现的

不过在springboot下你根本不用写filter, 只写注释就可以了

pom.xml

搭建本地git服务器

Submitted by Lizhe on Thu, 07/20/2017 - 11:46

其实下载编译完全可以使用yum

参考一下创建文件夹和用户就可以了

yum install curl-devel expat-devel gettext-devel openssl-devel zlib-devel

yum install gcc perl-ExtUtils-MakeMaker

wget https://www.kernel.org/pub/software/scm/git/git-2.10.0.tar.gz

tar -zvxf git-2.10.0.tar.gz

cd git-2.10.0

make all prefix=/usr/local/git

make install prefix=/usr/local/git

echo 'export PATH=$PATH:/usr/local/git/bin' >> /etc/bashrc

source /etc/bashrc

git --version

useradd -m gituser

passwd gituser

mkdir -p /data/repositories

free命令的available

Submitted by Lizhe on Thu, 07/20/2017 - 10:27

3.14内核新增了一个内存信息MemAvailable , 当调用free命令时可以显示为available

之前没留意过

[root@VM_167_46_centos etc]# free -h
                         total         used             free      shared     buff/cache      available
Mem:           993M        253M        334M         39M               405M             556M
Swap:           2.0G          82M             1.9G

我们知道used + free + buff 基本等于 total

used是被使用的

free是完全没有被使用的

shared是被程序之间可以(已经被)共享使用的

buffers是指用来给块设备做的缓冲大小,它只记录文件系统的metadata以及 tracking in-flight pages

cached是用来给文件做缓冲

Java 编码安全 (1) 如何比较数组

Submitted by Lizhe on Wed, 07/19/2017 - 12:07

先看下面的代码

int[] a = new int[10];
 int[] b = new int[10];
        
System.out.println(a==b);

上面代码会直接打印出 false , 正常来讲初始化的int数组值应该都是0 , 那为什么两个数组不相等呢

rootcause在于, 数组并不会重写Object.equals() 方法, 而原始的equals方法比较的是引用

两个数组的引用不同, 自然结果是false 

正确的做法应该是使用Arrays.equals(a,b)

import java.util.Arrays;

关于"在用户设定的时间发送邮件"的功能设计

Submitted by Lizhe on Mon, 07/17/2017 - 17:23

这个问题其实还是Brian问的, 他真的去做那个 "拍卖系统" 了

这个拍卖系统有一个需求是  " 假设用户设定的拍卖开始时间是2017年1月1日中午12点, 那么系统需要在拍卖会开始之前半个小时给参与的bidder们发送提醒邮件"

这个功能看起来貌似很简单, 不过仔细想起来以前好像还真没碰到类似的

1. 发送邮件的job触发一次之后, 就会被移除 ( 不像springbatch或者crontab那种定时器触发, 要触发好多次)

2. job的数量不固定, 以前做的job都是程序员设定的, 不会由用户创建, 所以如果job数量特别大,可能会出问题

3. job的触发时间是用户设定的, 如果同一时间有大量job需要触发, 而且如果邮件发送特别慢的话,也可能会出问题

 

下面给出两个解决方案

  • 使用atd服务实现
  • 使用redis+rabbitmq写代码实现

总的来说各有利弊, 下面请看详细

 


第一种, 使用atd服务实现

安装atd服务
yum -y install at