使用场景:发布、订阅模式,发送端发送广播消息,多个接收端接收。
前面我们实现了工作队列,并且我们的工作队列中的一个任务只会发给一个工作者,除非某个工作者未完成任务意外被杀死,会转发给另外的工作者。这篇博客中,我们会做一些改变,就是把一个消息发给多个消费者,这种模式称之为发布/订阅(类似观察者模式)。
为了验证这种模式,我们准备构建一个简单的日志系统。这个系统包含两类程序,一类程序发动日志,另一类程序接收和处理日志。 在我们的日志系统中,每一个运行的接收者程序都会收到日志。然后我们实现,一个接收者将接收到的数据写到硬盘上,与此同时,另一个接收者把接收到的消息展现在屏幕上。 本质上来说,就是发布的日志消息会转发给所有的接收者。
转发器(Exchanges)前面的博客中我们主要的介绍都是发送者发送消息给队列,接收者从队列接收消息。下面我们会引入Exchanges,展示 RabbitMQ 的完整的消息模型。RabbitMQ 消息模型的核心理念是生产者永远不会直接发送任何消息给队列,一般的情况生产者甚至不知道消息应该发送到哪些队列。相反的,生产者只能发送 ...
工作队列的主要任务是:避免立刻执行资源密集型任务,然后必须等待其完成。相反地,我们进行任务调度:我们把任务封装为消息发送给队列。工作进行在后台运行并不断的从队列中取出任务然后执行。当你运行了多个工作进程时,任务队列中的任务将会被工作进程共享执行。这样的概念在 web 应用中极其有用,当在很短的 HTTP 请求间需要执行复杂的任务
生产者:
1234567891011121314151617181920212223242526272829public class NewTask { //队列名称 private final static String QUEUE_NAME = "workqueue"; public static void main(String[] args) throws IOException { //创建连接和频道 ConnectionFactory factory = new ConnectionFactory(); factory.setHost(&q ...
RabbitMQ 是一个由 erlang 开发的 AMQP(Advanced Message Queue )的开源实现。AMQP 的出现其实也是应了广大人民群众的需求,虽然在同步消息通讯的世界里有很多公开标准(如 COBAR 的 IIOP ,或者是 SOAP 等),但是在异步消息处理中却不是这样,只有大企业有一些商业实现(如微软的 MSMQ ,IBM 的 Websphere MQ 等),因此,在 2006 年的 6 月,Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。
RabbitMQ 是由 RabbitMQ Technologies Ltd 开发并且提供商业支持的。该公司在 2010 年 4 月被 SpringSource(VMWare 的一个部门)收购。在 2013 年 5 月被并入 Pivotal。其实 VMWare,Pivotal 和 EMC 本质上是一家的。不同的是 VMWare 是独立上市子公司,而 Pivotal 是整合了 EMC 的某些资源,现在并没有上市。
RabbitMQ 的官网是http://www.rabbitmq.com
应用
R ...
新时代码农
未读1. 轮询法将请求按顺序轮流地分配到后端服务器上,它均衡地对待后端的每一台服务器,而不关心服务器实际的连接数和当前的系统负载。
2.随机法通过系统的随机算法,根据后端服务器的列表大小值来随机选取其中的一台服务器进行访问。由概率统计理论可以得知,随着客户端调用服务端的次数增多,其实际效果越来越接近于平均分配调用量到后端的每一台服务器,也就是轮询的结果。
3. 源地址哈希法源地址哈希的思想是根据获取客户端的 IP 地址,通过哈希函数计算得到的一个数值,用该数值对服务器列表的大小进行取模运算,得到的结果便是客服端要访问服务器的序号。采用源地址哈希法进行负载均衡,同一 IP 地址的客户端,当后端服务器列表不变时,它每次都会映射到同一台后端服务器进行访问。
4. 加权轮询法不同的后端服务器可能机器的配置和当前系统的负载并不相同,因此它们的抗压能力也不相同。给配置高、负载低的机器配置更高的权重,让其处理更多的请;而配置低、负载高的机器,给其分配较低的权重,降低其系统负载,加权轮询能很好地处理这一问题,并将请求顺序且按照权重分配到后端。
5. 加权随机法与加权轮询法一样,加权随机法也根据后端机器的配 ...
AI:人工智能
未读Curator 是 Netflix 公司开源的一套 zookeeper 客户端框架,解决了很多 Zookeeper 客户端非常底层的细节开发工作,包括连接重连、反复注册 Watcher 和 NodeExistsException 异常等等。Patrixck Hunt(Zookeeper)以一句“Guava is to Java that Curator to Zookeeper”给 Curator 予高度评价。引子和趣闻:Zookeeper 名字的由来是比较有趣的,下面的片段摘抄自《从 PAXOS 到 ZOOKEEPER 分布式一致性原理与实践》一书:Zookeeper 最早起源于雅虎的研究院的一个研究小组。在当时,研究人员发现,在雅虎内部很多大型的系统需要依赖一个类似的系统进行分布式协调,但是这些系统往往存在分布式单点问题。所以雅虎的开发人员就试图开发一个通用的无单点问题的分布式协调框架。在立项初期,考虑到很多项目都是用动物的名字来命名的 (例如著名的 Pig 项目),雅虎的工程师希望给这个项目也取一个动物的名字。时任研究院的首席科学家 Raghu Ramakrishnan 开玩笑说 ...
基础数据结构字符串
字符串类型的值实际可以 是字符串(简单的字符串、复杂的字符串(例如 JSON、XML))、数字 (整数、浮点数),甚至是二进制(图片、音频、视频),但是值最大不能 超过 512MB。
12345set key value [ex seconds] [px milliseconds] [nx|xx]setex key seconds valuesetnx key value
set 命令有几个选项:
ex seconds:为键设置秒级过期时间。
px milliseconds:为键设置毫秒级过期时间。
nx:键必须不存在,才可以设置成功,用于添加。
xx:与 nx 相反,键必须存在,才可以设置成功,用于更新。
set、setnx、set xx 的区别123456789101112redis> get namedong4jredis> setnx name dong# 因为 name 已存在, 设置失败0redis> get namedong4jredis> set name dong4j xx# name 存在才能使用 xxOKred ...
Redis 的 5 种数据结构
Redis 数据结构和内部编码
Redis 的单线程模型Redis 使用单线程处理命令, 所以一条命令从客户端达到服务端不会立即执行, 所有命令都会进入一个队列, 然后逐个被执行.
Redis 单线程处理速度快的原因
纯内存访问, 内存的响应时长约为 100 纳秒
非阻塞 I/O, Redis 使用 epoll 作为 I/O 多路复用技术的实现, 再加上 Redis 自身的事件处理模型将 epoll 中的连接、读写、关闭都转换为事件,不 在网络 I/O 上浪费过多的时间
单线程避免了线程切换和竞态产生的消耗
存在的问题
对于每个命令的执行时间有要求.
如果某个命令执行时间过长, 会造成其他命令阻塞
新时代码农
未读Redis 可执行文件说明
可执行文件
作用
redis-server
启动 Redis
redis-cli
Redis 命令行客户端
redis-benchmark
Redis 基准测试工具
redis-check-aof
Redis AOF 持久化文件检测和修复工具
redis-check-dump
Redis RDB 持久化文件检测和修复工具
redis-sentinel
启动 Redis Sentinel
启动方式1. 默认配置
1redis-server
2. 运行参数
12345# 格式redis-server --configKey1 configValue1 --configKey2 configValue2# 使用 6380 端口启动 redisredis-server --port 6380
3. 配置文件
1redis-server /usr/local/redis/redis.conf
3.1 基础配置
配置名
说明
port
端口
logfile
日志文件
dir
Redis 工作目录 (存放持久化文 ...
系统 Centos 64 位
第一步,首先下载 Nginx 的 tar 包及安装依赖的工具 tar 包。Nginx: http://nginx.org/en/download.html
Nginx 需要依赖下面 3 个包gzip 模块需要 zlib 库 ( 下载: http://www.zlib.net/ )rewrite 模块需要 pcre 库 ( 下载: http://www.pcre.org/ )ssl 功能需要 openssl 库 ( 下载: http://www.openssl.org/ )
分别解压。具体命令:
123456789wget http://nginx.org/download/nginx-1.13.2.tar.gzwget http://www.zlib.net/zlib-1.2.11.tar.gzwget https://ftp.pcre.org/pub/pcre/pcre-8.40.tar.gzwget https://www.openssl.org/source/openssl-fips-2.0.16.tar.gztar zxvf openssl-fip ...
Redis 的 3 种用法
内存缓存
定量数据指标
发布/订阅模型
作为内存环境数据结构1. 字符串 string
1234567891011121314// 设置字符串类型set mystr "hello world!"// 读取字符串类型get mystr// 通过字符串类型进行数值操作 在遇到数值操作时,redis 会将字符串类型转换成数值。127.0.0.1:6379> set mynum "2"OK127.0.0.1:6379> get mynum"2"127.0.0.1:6379> incr mynum(integer) 3127.0.0.1:6379> get mynum"3"
INCR 等指令本身就具有原子操作的特性,所以我们完全可以利用 redis 的 INCR、INCRBY、DECR、DECRBY 等指令来实现原子计数的效果,假如,在某种场景下有 3 个客户端同时读取了 mynum 的值(值为 2),然后对其同时进行了加 1 的操作,那么,最后 m ...
1. 下载 & 安装MongoDB 3.0 正式版本发布! 这标志着 MongoDB 数据库进入了一个全新的发展阶段,提供强大、灵活而且易于管理的数据库管理系统。MongoDB 宣称,3.0 新版本不只提升 7 到 10 倍的写入效率以及增加 80% 的数据压缩率,还能减少 95% 的运维成本。 MongoDB 3.0 主要新特性包括: · 可插入式的存储引擎 API · 支持 WiredTiger 存储引擎 ·MMAPv1 提升 · 复制集全面提升 · 集群方面的改进 · 提升了安全性 · 工具的提升 WiredTiger 存储引擎是一项难以置信的技术实现,提供无门闩、非堵塞算法来利用先进的硬件平台 (如大容量芯片缓存和线程化架构) 来提升性能。通过 WiredTiger,MongoDB 3.0 实现了文档级别的并发控制,因此大幅提升了大并发下的写负载。
MongoDB 提供了 centos yum 安装方式。
vi /etc/yum.repos.d/mongodb-org-3.0.repo
1234 ...
使用 root 用户登录,下面的操作基本都没有 root 的困扰,如果非 root 用户请切换至 root 用户操作。
1、查看系统当前的 shell
1echo $SHELL
返回结果如下:
1/bin/bash
PS. 默认的 shell 一般都是 bash
2、查看 bin 下是否有 zsh 包
1cat /etc/shells
返回结果如下:
123456/bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh
PS. 默认没有安装 zsh
3、安装 zsh 包
1yum -y install zsh
安装完成后查看 shell 列表:
1cat /etc/shells
返回结果如下:
1234567/bin/sh/bin/bash/sbin/nologin/bin/dash/bin/tcsh/bin/csh/bin/zsh
现在 zsh 已经安装完成了,需要把系统默认的 shell 由 bash 切换为 zsh
3、切换 shell 至 zsh,代码如下:
1chsh -s /bin/zsh
chsh ...
简述使用 linux 就离不开 shell,那么也就是说也离不开 shell 编程。很多时候服务器都需要编写一些计划任务来定时运行的,所以掌握一些基本的 shell 编程基础很有必要。
本文是我在网上收集的一些资料,主要目的是帮助自己更好的了解掌握 shell 编程的一些基础知识。
什么是 Shell 脚本示例看个例子吧:
123456789#!/bin/shcd ~mkdir shell_tutcd shell_tutfor ((i=0; i<10; i++)); do touch test_$i.txtdone
示例解释:
第 1 行:指定脚本解释器,这里是用/bin/sh 做解释器的
第 2 行:切换到当前用户的 home 目录
第 3 行:创建一个目录 shell_tut
第 4 行:切换到 shell_tut 目录
第 5 行:循环条件,一共循环 10 次
第 6 行:创建一个 test_1…10.txt 文件
第 7 行:循环体结束
123cd, mkdir, touch 都是系统自带的程序,一般在/bin或者/usr/bin目录下。f ...
新时代码农
未读定义变量1234567891011#!/bin/bash# 定义 变量名和等号之间不能有空格your_name="dong4j"# 使用echo ${your_name}# 循环输出for skill in Ada Coffe Action Javado echo "I am good at ${skill} Script"done
只读变量readonly 变量名
删除变量unset 变量名
特殊变量1234567891011121314$0当前脚本的文件名$n传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。$#传递给脚本或函数的参数个数。$*传递给脚本或函数的所有参数。$@传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。$?上个命令的退出状态,或函数的返回值。$$当前 Shell 进程 ID。对于 Shell 脚本,就是这些脚本所在的进程 ID。
shell 替换命令替换1234#!/ ...