0%

一、概述

消息队列(Message queue),简称MQ,是一种进程间通信或者同一进程的不同线程间的通信方式。通用的使用场景为:

不需要立即获取结果,但是并发量又要进行控制时。

二、使用场景

消息队列主要使用场景:

  • 异步处理:多应用对消息队列中同一消息进行处理,应用间并发处理消息,减少处理时间。
  • 应用耦合:多应用对消息队列中同一消息进行处理,避免应用接口失败导致整个过程的失败。
  • 限流削峰: 避免流量过大导致应用挂掉。
  • 消息驱动的系统:系统分为消息队列、消息生产者、消息消费者,生产者负责产生消息,消费者(可能有多个)负责对消息进行处理. 多个子系统由消息队列连接起来,比如:日志处理.

三、消息队列的两种模式

消息队列包括两种模式,点对点模式(point to point, queue)和发布/订阅模式(publish/subscribe,topic).

点对点模式,主要是一个消息只有一个消费者.当消费者接收到消息后,向消息队列通知应答成功,消息队列将该消息从队列中删除.
点对点模式特点:

  • 每个消息只有一个接收者(Consumer);
  • 发送者和接收者间没有依赖性,发送者发送消息之后,不管有没有接收者在运行,都不会影响到发送者下次发送消息;
  • 接收者在成功接收消息之后需向队列应答成功,以便消息队列删除当前接收的消息;

发布订阅模式,发布者将消息发送到Topic,系统将这些消息传递给多个订阅者.
发布/订阅模式特点:

  • 每个消息可以有多个订阅者;
  • 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息。
  • 为了消费消息,订阅者需要提前订阅,并保持在线运行;

当发布者消息量很大时,显然单个订阅者的处理能力是不足的,多个订阅者节点组成一个订阅组负载均衡消费topic消息实现分组订阅.

删除指定文件

目录

1
2
3
4
5
6
a
b
c
test.md
test.rar
test1.rar
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 删除所有以 .rar 结尾的文件和目录
rm -rf *.rar

# 删除所有不是以 .rar 结尾的文件和目录
ls | grep -v *.rar | xargs rm -rf

# 将 ls 替换成 find 可以删除指定目录下的文件和目录
find . | grep -v ".*rar" | xargs rm -rf
find . ! -name "*.rar" | xargs rm -rf # ! 代表 -not
find . ! -name "*.rar" --exec # ! 代表 -not

# 删除 所有的 a 文件
find . -name "a" -type f | xargs rm -rf
# 删除 所有的 a 目录
find . -name "a" -type d -exec rm -rf {} \;
#

变量

1
2
3
4
5
6
7
name=lzh
names=(1 2 3 4)
echo ${name}
echo ${names}
echo $1 # 参数1
echo $@ # 所有参数
echo $* # 所有参数

字符串

1
2
3
4
5
6
str=lzh
str="lzh ${str}""haha"

echo ${#str} # 字符串长度
echo ${str:1:3} # 截取字符串从下标1开始往后面3个字符

数组

1
2
3
4
names=(1 2 3 4)
echo ${names[1]} #
echo ${names[@]} 所有数组元素
echo ${#names[@]} 数组长度

运算符

流程控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
if [[ $1 > 10]]
then
echo "参数大于10"
fi


for file in $@
do
if [[ -e ${file} ]]
then
rm -rf ${file}
else
echo "${file} not exis"
fi
done



a=100
while (($a > 0))
do
echo ${a}
done

# while循环可用于读取键盘信息
while read file
do
if [[ -e ${file} ]]
then
rm -rf ${file}
else
echo "${file} not exis"
fi
done

# 无限循环

wihle :
do
done


while true
do
done

for ((;;))

# case
name=$1
case ${name} in
1) echo 1
;;
2) echo 2
;;
3) echo 3
;;
*) echo "不在1-3"
esac

test 命令

1
2
3
4
if test -f ./env.sh
then
echo 1
fi

文件测试运算符

1
2
3
4
5
6
7
-d  文件夹
-f 文件
-r 可读
-w 可写
-x 可执行
-e 检测文件(包括目录)是否存在
-s 文件是否为空
1
2
3
4
5
6
if [[ -f ./env.sh ]]
then
echo "文件存在"
else
echo "文件不存在"
fi

函数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
hello(){
for name in $@
do
echo "hello ${name}"
done
}
hello $@


# 带返回值的函数

add(){
return `expr $1 + 2`
}
add 1
echo $? # 函数返回值在调用该函数后通过 $? 来获得

重定向

1
2
3
4
echo 1 > 1.md  #  以覆盖的方式重定向
echo 2 >> 2.md # 以追加的方式重定向
wc -l < 1.md # 键盘获取输入的命令会转移到文件读取内容

1
2
3
4
5
6
7
8
9
10
11
# here document 用来将输入重定向到一个交互式 Shell 脚本或程序。
wc -l << EOF
213 bd
dasf as
dasf
EOF

# 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符
# 包括空格和 tab 缩进。
# 开始的delimiter前后的空格会被忽略掉。

脚本中执行另一个脚本

1
2
. ./env.sh
source ./env.sh

需要注意路径,路径为脚本执行的时候路径

常用命令

1
2
3
4
5
6
7
8
#获取当前命令的绝对路径

basePath=$(cd `dirname $0`; pwd)
# 清空文件
> filename
echo "" >filename
: > filename
cat /dev/null > filename

grep

grep 全称为 Global Regular Expression Print

主要还是查看文档 grep --help

1
2
3
4
5
6
7
8
grep ltinyho test.md

-i 忽略大小写
-r或-R 递归查找目录
-w 查找单词
-v 匹配所有不满足的条件


ps

ps命令是Process Status的缩写

1
2
3
4
-A 或者 -e 全部进程
e 显示环境变量
f 显示程序之间的关系

netstat

1
2
3
4
5
6
7
netstat -nlput 

-n 显示网络地址
-l 监听的端口
-p pid
-u udp
-t tcp

sed (steam editor)

使用数据流重导向,不修改源文件

1
2
3
4
5
6
7
8
# 删除第3行到最后一行
nl test.md | sed '3,$d' # a新增,d删除,i插入,p打印,c取代
# 将ltinyho 替换为 haha
nl test.md | sed "s/ltinyho/haha/g" > new.md
# 打印包含 ltinyho 的行
nl test.md | sed "/ltinyho/p"
# 删除包含ltinyho 的行
nl test.md | sed "/ltinyho/d"

awk

awk工作流程是这样的:读入有’\n’换行符分割的一条记录,然后将记录按指定的域分隔符划分域,填充域,$0则表示所有域,$1表示第一个域,$n表示第n个域。
默认域分隔符是”空白键” 或 “[tab]键”.

1
2
3
4
last -n 100
#ltinyho pts/2 2.2.71.1 Wed Dec 5 21:44 still logged in
#ltinyho pts/1 1.2.71.1 Wed Dec 5 21:05 still logged in
last -n 100 | awk '{print $3}' # 打印 ip 这一列

crontab

定时任务
通过 crontab 可以在固定时间间隔执行shell script.

查看 crontab 日志

重新启动 sudo service cron restart

1
2
3
4
5
6
7
8
9
10
# m(minute) h(hour) dom(day of month) mon(month) dow(day of week)

# 每隔1分钟执行 shell,并将错误输出和标准输出重定向到log文件中,注意 2>&1 在最后
* * * * * ~/shell/echo.sh >> $HOME/log/crontab/log.log 2>&1

# 18-6时每刻执行
0,15,30,45 18-6 * * *

#
0,30 8-11 */2 * *

其他注意事项
新创建的cron job,不会马上执行,至少要过2分钟才执行。如果重启cron则马上执行。
注意环境变量问题,有时我们创建了一个crontab,但是这个任务却无法自动执行,而手动执行这个任务却没有问题,这种情况一般是由于在crontab文件中没有配置环境变量引起的。

我不停的擦拭手中的利剑,不是因为我喜欢它,也不是因为它能带来安全,只是因为,每当下一次冲锋的号角响起时,我能够迅速拔出,纵横厮杀,直至战斗结束,不让自己倒下。 …… 生活在这样的时代,与其被迫上场,心怀恐惧,不如主动征伐,加入时代的滚滚大潮当中,去见识一下时代的风采,写下自己的故事。

mysql 学习

备份表数据

1
2
3

create table2 backup select * from table1