0%

Git 支持在本地仓库进行程序项目的版本管理,这个本地的 git 仓库在程序项目的文件夹内(也就是 “.git” 文件夹内)。随着程序项目的推进,我们会把不同阶段的文件内容加入到这个 git 仓库中。这个仓库由我们直接操控,我们将它称之为“本地 git 仓库”。
除了“本地 git 仓库”外,如果需要与他人共同开发这个程序项目,还需要一个“远程 git 仓库”。程序项目,本地 git 仓库和远程 git 仓库之间的关系如图1所示。
这里写图片描述
图1:程序项目,本地仓库,远程仓库之间的关系

远程 git 仓库并不一定存储在另一台计算机中。很多人知道 git 支持 HTTP/HTTPS,SSH等协议,以允许本地 git 仓库与存在于另一台计算机中的远程 git 仓库之间传送数据。但实际上,远程 git 仓库也可以跟本地 git 仓库处于同一台电脑中,使用本地协议来进行数据的传送。

阅读全文 »

MongoDB是当今非常流行的一款NoSQL数据库,本文介绍如何使用MongoDB的Java驱动来操作MongoDB。
MongoDB图标

一、引入MongoDB Java Driver包

如果需要操作MongoDB的Java项目是一个Maven项目,可以在依赖中加上以下的配置。

1
2
3
4
5
6
7
<dependencies>
<dependency>
<groupId>org.mongodb</groupId>
<artifactId>mongo-java-driver</artifactId>
<version>2.13.2</version>
</dependency>
</dependencies>

或者通过直接下载jar包的方式使用,下载地址:mongo-java-driver-2.13.2.jar
详细的如何引入MongoDB jar包的方法可以参考官方文档

阅读全文 »

Requests是一常用的http请求库,它使用python语言编写,可以方便地发送http请求,以及方便地处理响应结果。

一、安装

1.1 使用pip进行安装

要安装requests,最方便快捷的方法是使用pip进行安装。

pip install requests

如果还没有安装pip,这个链接 Properly Installing Python 详细介绍了在各种平台下如何安装python以及setuptools,pip,virtualenv等常用的python工具,可以参考其中的步骤来进行安装。如果是在Windows平台下使用requests,也可以参考 《Windows下安装Django》 中有关 pip 安装的介绍来安装pip。

1.2 使用源代码安装

可以在github上下载最新的requests的源代码

git clone git://github.com/kennethreitz/requests.git

下载成功后,使用以下命令进行安装

python setup.py install

二、使用

2.1 发送http请求

为了使用requests,需要首先将requests库import进来:

1
import requests

然后,可以使用requests来发送http请求,例如发送get请求:

1
r = requests.get('http://httpbin.org/ip')

执行此行代码,获得一个Response对象r,从r可以获取http请求的响应结果。

如果要发送post请求,则

1
r = requests.post('http://httpbin.org/post', data={'name': 'leo'})
阅读全文 »

本文讲述实现负载均衡的常用算法。

轮询法(Round Robin)

轮询法是负载均衡中最常用的算法,它容易理解也容易实现。
轮询法是指负载均衡服务器(load balancer)将客户端请求按顺序轮流分配到后端服务器上,以达到负载均衡的目的。
假设现在有6个客户端请求,2台后端服务器。当第一个请求到达负载均衡服务器时,负载均衡服务器会将这个请求分派到后端服务器1;当第二个请求到害时,负载均衡服务器会将这个请求分派到后端服务器2。然后第三个请求到达,由于只有两台后端服务器,故请求3会被分派到后端服务器1。依次类推,其示意图如图1所示。

这里写图片描述
图1:轮询法负载均衡

阅读全文 »

概述

文章负载均衡(Load Balancing)学习笔记(一) 讲述了负载均衡的一般性原理,本文继续介绍常见的实现负载均衡的方法。

HTTP重定向

HTTP重定向服务器是一台普通的Web服务器,用户的请求先到达重定向服务器,这台服务器会挑选一台后端服务器的地址(例如使用轮询的方式),并将该地址写入HTTP重定向响应结果中(以响应状态码302返回)返回给用户。用户将根据这个新的地址重新发送请求到选中的服务器上。选中的服务器会处理用户请求,并将结果返回给用户。
HTTP重定向的处理流程如图1所示。

图1:HTTP重定向实现负载均衡

通过重定向服务器的处理,用户请求被分配到不同的后端服务器上进行处理,实现了负载均衡的目的。

优点

HTTP重定向负载均衡的方法实现上比较简单。

缺点

  1. 增加了用户的时延,因为访问请求需要进行两次往返
  2. 重定向服务器没有将后端服务器的负载差异考虑进去,有些后端服务器可能在相当繁忙时仍然接收到较多的请求
  3. 重定向服务器的并发处理能力制约着整个系统的并发处理能力
  4. 如果重定向服务器出现故障,站点就会瘫痪

由于存在这些缺点,HTTP重定向通常都会与其他一种或多种负载均衡技术结合使用。

阅读全文 »

使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法。

SETNX命令简介

命令格式

SETNX key value

将 key 的值设为 value,当且仅当 key 不存在。
若给定的 key 已经存在,则 SETNX 不做任何动作。
SETNX 是SET if Not eXists的简写。

返回值

返回整数,具体为

  • 1,当 key 的值被设置
  • 0,当 key 的值没被设置

例子

redis> SETNX mykey “hello”
(integer) 1
redis> SETNX mykey “hello”
(integer) 0
redis> GET mykey
“hello”
redis>

使用SETNX实现分布式锁

多个进程执行以下Redis命令:

SETNX lock.foo <current Unix time + lock timeout + 1>

如果 SETNX 返回1,说明该进程获得锁,SETNX将键 lock.foo 的值设置为锁的超时时间(当前时间 + 锁的有效时间)。
如果 SETNX 返回0,说明其他进程已经获得了锁,进程不能进入临界区。进程可以在一个循环中不断地尝试 SETNX 操作,以获得锁。

阅读全文 »

关键词:虚函数,虚表,虚表指针,动态绑定,多态

一、概述

为了实现 C++ 的多态,C++ 使用了一种动态绑定的技术。这个技术的核心是虚函数表(下文简称虚表)。本文介绍虚函数表是如何实现动态绑定的。

二、类的虚表

每个包含了虚函数的类都包含一个虚表。

我们知道,当一个类(A)继承另一个类(B)时,类 A 会继承类 B 的函数的调用权。所以如果一个基类包含了虚函数,那么其继承类也可调用这些虚函数,换句话说,一个类继承了包含虚函数的基类,那么这个类也拥有自己的虚表。

我们来看以下的代码。类 A 包含虚函数vfunc1vfunc2,由于类 A 包含虚函数,故类 A 拥有一个虚表。

1
2
3
4
5
6
7
8
9
class A {
public:
virtual void vfunc1();
virtual void vfunc2();
void func1();
void func2();
private:
int m_data1, m_data2;
};

类 A 的虚表如图 1 所示。

图 1:类 A 的虚表示意图

阅读全文 »

概述

在分布式系统中,负载均衡(Load Balancing)是一种将任务分派到多个服务端进程的方法。例如,将一个HTTP请求派发到实际的Web服务器中执行的过程就涉及负载均衡的实现。一个HTTP请求到达Web服务器,这中间涉及多个过程,也存在多种不同负载均衡的方法。本文讲述负载均衡的基本原理与派发策略,下图1是负载均衡的基本原理图,图1中客户端的请求请求经过达负载均衡器(Load Balancer)的分派,被指定的服务器进程进行处理。

图1:负载均衡基本原理

实现负载均衡主要有两个目的。第一个目的是将任务的处理负载均摊到不同的进程,以减少单一进程的负载,以达到处理能力水平扩容的目的。第二个目的则是提高容错能力。我们知道,在线上正式环境中,机器宕机或者进程异常导致服务不可用是常有的现象。在实现负载均衡的系统中,多个服务器进程提供同样的服务,一个进程不可用的情况下,任务会被负载均衡器派发到其他可用的进程,以达到高可用的目的。在多台不同的服务器中部署相同的服务进程,通过负载均衡对外提供服务,这组进程也称为“集群”(cluster)。

负载均衡实现策略

常见的负载均衡实现策略有以下几种:

  • 均匀派发(Even Task Distribution Scheme)
  • 加权派发(Weighted Task Distribution Scheme)
  • 粘滞会话(Sticky Session Scheme)
  • 均匀任务队列派发(Even Size Task Queue Distribution Scheme)
  • 单一队列(Autonomous Queue Scheme)

均匀派发(Even Task Distribution Scheme)

均匀派发是实现负载均衡最简单的策略,均衡派发的意思是指任务将均匀地派发到所有的服务器进程。在实现时,可以使用随机派发或者轮流派发(Round Robin)。

图2:均匀派发策略

均匀派发策略假设集群内所有进程具有相同的处理能力,且任务处理用时相同。但实际上,由于进程部署环境的不同,其处理能力一般不同,任务处理时间也不尽相同。因此均匀派发的策略并不能很好地将任务负载均滩到各个进程中。

阅读全文 »

引入

在业务开发中,我们常把数据持久化到数据库中。如果需要读取这些数据,除了直接从数据库中读取外,为了减轻数据库的访问压力以及提高访问速度,我们更多地引入缓存来对数据进行存取。读取数据的过程一般为:

图1:加入缓存的数据读取过程

对于分布式缓存,不同机器上存储不同对象的数据。为了实现这些缓存机器的负载均衡,可以使用式子1来定位对象缓存的存储机器:

m = hash(o) mod n ——式子1

其中,o为对象的名称,n为机器的数量,m为机器的编号,hash为一hash函数。图2中的负载均衡器(load balancer)正是使用式子1来将客户端对不同对象的请求分派到不同的机器上执行,例如,对于对象o,经过式子1的计算,得到m的值为3,那么所有对对象o的读取和存储的请求都被发往机器3执行。

图2:如何利用Hash取模实现负载均衡

式子1在大部分时候都可以工作得很好,然而,当机器需要扩容或者机器出现宕机的情况下,事情就比较棘手了。

阅读全文 »