高并发场景下的流控管理

  categories:资料  author:

任何应用都有一个设计指标,当应用的压力超过了他设计所能承载的能力时,就好比一座只允许行人通过的独木桥,是无法承载一辆坦克的重量的,这个时候,为了让机器能够继续运行,在不宕机的情况下尽其所能的对一部分用户提供服务,保证整个流程能够继续走下去,这个时候,就必须对应用进行流控,丢弃一部分用户的请无法避免。

流控可以从多个维度来进行,比如针对QPS并发线程数黑白名单加权分级等等,最典型最直接的便是针对QPS并发线程数的流控。当然,要进行流控,首先等有一个流控的阀值,这个阀值不是说拍拍脑袋就能够想出来,不同类型的应用,所面临的情况不一样,也没有一个统一的衡量标准,必须经过多轮的压力测试,才能够得出一个比较靠谱的数值。

一、简单的流控

1、使用Semphore进行并发流控

模拟代码如下所示:

  Semaphore semphore = new Semaphore(10);  
  if(semphore.getQueueLength() > 10){  
   //等待队列阀值为10时  
    return;  
  }  
  try {  
   semphore.acquire();  
       
   //干活  
       
  } catch (InterruptedException e) {  
       e.printStackTrace();  
  }finally{  
     semphore.release();//释放  
  
阅读全文

业务规则引擎开源软件介绍

  categories:资料  author:

1、规则引擎 Apache Camel

Apache Camel 是一个非常强大的基于规则的路由以及媒介引擎,该引擎提供了一个基于POJO的 企业应用模式(Enterprise Integration Patterns)的实现,你可以采用其异常强大且十分易用的API (可以说是一种Java的领域定义语言 Domain Specific Language)来配置其路由或者中介的规则。 通过这种领域定义语言,你可以在你的IDE中用简单的Java Code就可以写出一个类型安全并具有一定智能的规则描述文件。这与那种复杂的XML配置相比极大简化了规则定义开发。 当然Apache Camel也提供了一个对Spring 配置文件的支持。

Apache Camel 采用URI来描述各种组件,这样你可以很方便地与各种传输或者消息模块进行交互,其中包含的模块有 HTTP, ActiveMQ, JMS, JBI, SCA, MINA or CXF Bus API。 这些模块是采用可插拔的方式进行工作的。Apache Camel的核心十分小巧你可以很容易地将其集成在各种Java应用中。

目前Apache Camel作为一个路由以及媒介引擎可以与如下项目集成。
Apache ActiveMQ
Apache CXF
Apache

阅读全文

centos7Docker私有仓库搭建及删除镜像

  categories:资料  author:

如果不想用私有镜像库,你可以用docker的库 https://hub.docker.com

 环境准备

环境:两个装有Docker 17.09.0-ce 的centos7虚拟机
虚拟机一:192.168.0.154 用户开发机
虚拟机二:192.168.0.153 用作私有仓库

 


 

搭建私有仓库


在153机器上下载registry镜像

docker pull registry

下载完之后我们通过该镜像启动一个容器

docker run -d -p 5000:5000 registry

默认情况下,会将仓库存放于容器内的/tmp/registry目录下,这样如果容器被删除,则存放于容器中的镜像也会丢失,所以我们一般情况下会指定本地一个目录挂载到容器内的/tmp/registry下,

不过具体的情况还是要到容器里去看

先启动容器

docker run -d -p 5000:5000 -v /opt/data/registry:/tmp/registry registry 
b4c21ca8cf8a23ea72e0471909742541ffc312ea5cf492486b5bdc3130179864

可以看到容器存放位置不在/tmp 下

我们接着来查找下,挂载位置到底在哪里

可以看到registry … 阅读全文

一张图搞定OAuth2.0

  categories:资料  author:

1、引言

本篇文章是介绍OAuth2.0中最经典最常用的一种授权模式:授权码模式

非常简单的一件事情,网上一堆神乎其神的讲解,让我不得不写一篇文章来终结它们。

一项新的技术,无非就是了解它是什么为什么怎么用。至于为什么,本篇文章不做重点探讨,网上会有各种文章举各种什么丢钥匙、发船票的例子供你去阅读,个人认为还是有些哗众取宠,没有聊到本质。

那我们就重点聊聊OAuth2.0是什么怎么用。但首先在读本文之前,你要先对OAuth2.0有一定的了解,建议先读一下阮一峰的oauth2.0文章,直接看“授权码模式”即可,带着疑问再来读本文效果更好。

http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html

2、OAuth2.0是什么

OAuth2.0是什么——豆瓣和QQ的故事

OAuth简单说就是一种授权的协议,只要授权方和被授权方遵守这个协议去写代码提供服务,那双方就是实现了OAuth模式。

举个例子,你想登录豆瓣去看看电影评论,但你丫的从来没注册过豆瓣账号,又不想新注册一个再使用豆瓣,怎么办呢?不用担心,豆瓣已经为你这种懒人做了准备,用你的qq号可以授权给豆瓣进行登录,请看。

第一步:在豆瓣官网点击用qq登录

第二步:跳转到qq登录页面输入用户名密码,然后点授权并登录

第三步:跳回到豆瓣页面,成功登录

这几秒钟之内发生的事情,在无知的用户视角看来,就是在豆瓣官网上输了个qq号和密码就登录成功了。在一些细心的用户视角看来,页面经历了从豆瓣到qq,再从qq到豆瓣的两次页面跳转。但作为一群专业的程序员,我们还应该从上帝视角来看这个过程。

OAuth2.0是什么——上帝视角

简单来说,上述例子中的豆瓣就是客户端,QQ就是认证服务器阅读全文

面向过程和面向对象的计算机编程

  categories:儿童计算机  author:

本文是 从锦囊妙计联想到的16集, 从本集开始 要开始些实用的东西, 然后在分享一下 使用的视频教程, 参照这些教程可以进行简单的计算机的入门等操作了。

前面的加上本集, 大概一共15集 , 主要是说明了一下计算机基本上都工作原理, 由于本人水平有限, 也未必都是正确的, 仅仅是给初学者提供一个帮助。前面通过各种例子试图说明 计算机就是执行程序的一个 机器, 他的执行必须依赖指令, 而指令其实就相当于锦囊一样。

 下面的一段文字内容很重要, 要仔细瞧

     计算机程序复杂到一定程度后, 就会有大量的锦囊(指令的存在), 而锦囊多到一定程度后, 就很难管理了,这个时候, 我们就需要根据各个锦囊的相关程度和特点以及一些执行顺序把这些锦囊要分类打包到一个大的锦囊中去。然后别人才好使用。

现在的问题是当问题复杂到一定程度后, 这个负责打包的人负责整理的人能否完整的考虑清楚 每个分类, 每个打包的情况吗? 这个是非常重要的问题。

先放下这个问题, 先仔细看看 常见的解决问题的过程, 看看是否能解决上述的问题。

一。基于过程,基于函数,面向过程

上面的几个说法基本上没什么特别大的区别, 基本是一样就像谁能说出老鼠同耗子的区别, 反正我不知道有什么区别。

1.

阅读全文

让我们了解程序运行情况与参与程序的运行

  categories:儿童计算机  author:

本文是 从锦囊妙计联想到的15集(中间跳过了一个编号, 那个不吉利)

这个文章重点研究一下window和android里面的activity他们的作用

本文是上一集的延续,继续说一下如何与程序运行的, 了解程序运行的必要性。

一。人机交互的必要性

在本系列的最开始, 说过 计算机是个 笨东西, 你给他安排了什么工作他就做什么工作, 你说错了, 他也会重复错的, 你牵来一只羊, 对计算机说这个是马, 计算机就认为这个是马, 他没有智能不能自己思考(有一类特殊程序例外, 后面我们会慢慢谈到这个的), 因此你说了什么他就认为什么。这个就是计算机, 就是一个忠实的程序员的信徒。

那么随着程序员编写程序的功能的变多, 功能多了, 程序复杂了, 程序可能错的情况就多了, 因此需要在程序运行过程中, 让外面的人了解程序运行的状况, 看程序是否还在正常运行。

另外 有时候程序运行时还需要用户提供一定的信息和数据, 例如到一些政府部门去办理业务, 他们操作的也是计算机, 但是需要您自己提供一些数据等, 这样程序才能继续进行操作。

再有有些程序需要用户的积极参与才能运行, 例如电脑游戏,需要用操作电脑终端,进而操作计算机里面的角色, 参与计算机程序的运行。这样用户相当于进入了一个新的思想世界,参与其中。

那么如何 了解程序内部,或者操作程序内部, 计算机如何将内部信息展示给外部世界?… 阅读全文

基于 GlusterFS 实现 Docker 集群的分布式存储

  categories:资料  author:

以 Docker 为代表的容器技术在云计算领域正扮演着越来越重要的角色,甚至一度被认为是虚拟化技术的替代品。企业级的容器应用常常需要将重要的数据持久化,方便在不同容器间共享。为了能够持久化数据以及共享容器间的数据,Docker 提出了 Volume 的概念。单机环境的数据卷难以满足 Docker 集群化的要求,因此需要引入分布式文件系统。目前开源的分布式文件系统有许多,例如 GFS,Ceph,HDFS,FastDFS,GlusterFS 等。GlusterFS 因其部署简单、扩展性强、高可用等特点,在分布式存储领域被广泛使用。本文主要介绍了如何利用 GlusterFS 为 Docker 集群提供可靠的分布式文件存储。

GlusterFS 分布式文件系统简介

GlusterFS 概述

GlusterFS (Gluster File System) 是一个开源的分布式文件系统,主要由 Z RESEARCH 公司负责开发。GlusterFS 是 Scale-Out 存储解决方案 Gluster 的核心,具有强大的横向扩展能力,通过扩展能够支持数PB存储容量和处理数千客户端。GlusterFS 借助 TCP/IP 或 InfiniBand RDMA 网络将物理分布的存储资源聚集在一起,使用单一全局命名空间来管理数据。GlusterFS 基于可堆叠的用户空间设计,可为各种不同的数据负载提供优异的性能。

GlusterFS … 阅读全文

RocketMQ初探一:NameServer的作用

  categories:资料  author:

第一次真正接触Java消息服务是在2013年底,当时是给中国移动做统一支付平台,当时用的就是著名的Apache ActiveMQ,当时觉得很有趣,一个服务队列竟然可以玩出这么多花样来。当时为了尽快的入门,还把《Java Message Service》给看了一遍,这对于初学者的我收获颇多。我说知道的完全实现JMS规范的MOM有ActiveMQ/Apollo和HornetQ,都是采用Java实现。JMS中说明了Java消息服务的两种消息传送模型,即P2P(点对点)和Pub/Sub(发布订阅),在约定了一些消息服务特性的同时,并提供了一套接口API,是否实现了该API,标志着MOM是否支持JMS规范,JMS规范中定义了消息服务诸多特性,这些特性和他所面对的企业级服务场景相关,当然,这也严重限制了消息服务的吞吐量,完全实现JMS规范的MOM,性能总不会太高,而且JMS规范中没有涉及消息服务的分布式特性,导致大多数实现JMS规范的MOM分布式部署功能比较弱,只适合集群部署。

 

说到高性能消息中间件,第一个想到的肯定是LinkedIn开源的Kafka,虽然最初Kafka是为日志传输而生,但也非常适合互联网公司消息服务的应用场景,他们不要求数据实时的强一致性(事务),更多是希望达到数据的最终一致性。RocketMQ是MetaQ的3.0版本,而MetaQ最初的设计又参考了Kafka。最初的MetaQ 1.x版本由阿里的原作者庄晓丹开发,后面的MetaQ 2.x版本才进行了开源,这里需要注意一点的事,MetaQ 1.x和MetaQ 2.x是依赖ZooKeeper的,但RocketMQ(即MetaQ 3.x)却去掉了ZooKeeper依赖,转而采用自己的NameServer。

 

ZooKeeper是著名的分布式协作框架,提供了Master选举、分布式锁、数据的发布和订阅等诸多功能,为什么RocketMQ没有选择ZooKeeper,而是自己开发了NameServer,我们来具体看看NameServer在RocketMQ集群中的作用就明了了。

 

RocketMQ的Broker有三种集群部署方式:1.单台Master部署;2.多台Master部署;3.多Master多Slave部署;采用第3种部署方式时,Master和Slave可以采用同步复制和异步复制两种方式。下图是第3种部署方式的简单图:

 


 

图虽然是网上找的,但也足以说明问题,当采用多Master方式时,Master与Master之间是不需要知道彼此的,这样的设计直接降低了Broker实现的复查性,你可以试想,如果Master与Master之间需要知道彼此的存在,这会需要在Master之中维护一个网络的Master列表,而且必然设计到Master发现和活跃Master数量变更等诸多状态更新问题,所以最简单也最可靠的做法就是Master只做好自己的事情(比如和Slave进行数据同步)即可,这样,在分布式环境中,某台Master宕机或上线,不会对其他Master造成任何影响。

 

那么怎么才能知道网络中有多少台Master和Slave呢?你会很自然想到用ZooKeeper,每个活跃的Master或Slave都去约定的ZooKeeper节点下注册一个状态节点,但RocketMQ没有使用ZooKeeper,所以这件事就交给了NameServer来做了(看上图)。

 

结论一:NameServer用来保存活跃的broker列表,包括Master和Slave。

当然,这个结论百度一查就知道,我们移步到rocketmq-namesrv模块中最重要的一个类:RouteInfoManager,它的主要属性如下:

 

private final ReadWriteLock lock = new ReentrantReadWriteLock();

private final HashMap<String/* topic */, List<QueueData>> topicQueueTable;

private final … 阅读全文

如何做一个对账系统

  categories:资料  author:

在互联网行业中只要涉及到支付,必然就会有对账的需求,几乎所有互联网公司的业务中多多少少的都会涉及到支付,大一点的公司甚至都标配有了自己的第三方支付公司,因此对账具有普遍性。对账系统是支付体系中最重要的一环,也是保证交易、资金安全的最后一道防线。在大多数的互联网公司中,一般都会有独立的对账系统来处理,比如:电商平台、互联网金融、第三方支付公司等。对账是支付系统中的一环,因此在对账前我们先了解一下相关的业务知识

业务知识

什么是对账

传统的对账就是核对账目,是指在会计核算中,为保证账簿记录正确可靠,对账簿中的有关数据进行检查和核对的工作。在银行或者第三方支付中,对账其实是对一定周期内的交易进行双方确认的过程,一般都是在第二天银行或者第三方支付公司对前一日交易进行清分,生成对账单供平台商户下载,并将应结算款结算给平台商户。在往下一层,在互联网金融行业或者电商行业中,对账其实就是确认在固定周期内和支付提供方(银行和第反方支付)的交易、资金的正确性,保证双方的交易、资金一致正确。

广义的对账,所有跨应用的数据交互,理论上都应该进行对账。所以对账也可以分为信息流对账,资金流对账。信息流对账也一般用在自己内部系统的对账,比如支付系统的支付数据和业务系统的业务数据进行对账,保证资金交易和业务交易的一致性。资金流对账也就是支付系统和银行或者第三方支付系统之间的资金交易对账。

对账方式

  • 单向对账:一般拿第三方支付机构或银行流水,与自己系统进行对账,防止出现掉单问题;
  • 双向对账:两个应用间的流水进行双向核对,如订单与财务系统,既要保证财务系统支付成功的记录,订单系统也是成功的;也要确保订单系统记录成功的记录,财务系统也成功。

我们一般采用双向对账的方式进行对账

对账相关的问题

不同系统日切点不一致问题:滚动对账
差错处理:补账,补偿(退款)

相关概念

轧帐和平帐

每一笔交易,都要做到各参与者的记录能够吻合,没有偏差。对账系统的工作,是发现有差异的记录,即轧帐;然后通过人工或者自动的方式,解决这些差异,即平帐。

长款和漏单

在以平台交易为基准的情况下和银行对账,发现周期内的交易,平台有此订单而第三方支付中没有订单,成为平台长款。平台长款一般是由于用户在支付的时候跨天的情况,比如用户在23:58分创建了订单,在第二天的凌晨00:03分进行了支付。在以银行交易为基准的情况下对账,银行有此订单而平台无此订单,即为平台漏单。平台漏单很少见,一般直接转人工处理。

账户体系

在一般的支付体系中会分为登录账户和支付账户,支付账户指用户在支付系统中用于交易的资金所有者权益的凭证;登录账号指用户在系统中登录的凭证和个人信息。一个用户可以有多个登录账户,一个登录账户可以有多个支付账户,比如零钱账户、储值卡账户等。一般来说,支付账户不会在多个登录账户之间共用。对账的交易一般都是支付账户参与交易。

交易与账户

账户设置,一般是从交易开始的。 交易的实现必须有账户的支持,账户是交易的基本构成元素。 从支付系统的角度,交易中涉及到的资金流是资金从一个账户流向另一个账户。 发起交易的一方,被称之为交易主体,他可以是一个人,也可以是一个机构。

清算和结算

清算主要是指不同银行间的货币收付,可以认为是结算进行之前,发起行和接收行对支付指令的发送、接收、核对确认,其结果是全面交换结算工具和支付信息,并建立最终结算头寸。

结算是指将清算过程产生的待结算头寸分别在发起行、接收行进行相应的会计处理,完成资金转移,并通知收付双方的过程。当前,大多数银行结算业务的完成主要通过两类账户:一是银行间互相开立的代理账户,二是开立在央行、独立金融机构如银联、或者第三方支付机构的账户。

清算:计算各方应收应付钱款的时间与金额。结算:根据清算的结果在指定的时间对各方进行实际的资金转移操作

资金池

用户备付资金(如充值)统一放在企业的银行账户中,企业可以随意支配这些资金,即为资金池。与之对应的是第三方托管,用户备付资金是放在企业在第三方支付机构为用户开设的虚拟账户中,企业无法随意取出这些资金。现在互联网金融全面要求接入银行存管,就是银行会为每个用户创建一个资金账户来保护用户的资金,互联金融公司不能随意划拨这些资金账户中的金额。

对账系统

对账设计

reconciliation_design

对账系统的设计阶段,将对账系统分为四个模块,每个模块的负责自己的职能。

  • 文件获取模块:下载或者读取各渠道对账文件
  • 文件解析模块:创建不同的解析模板,根据渠道和文件类型获取对应的解析模板进行解析
  • 对账处理模块:对账的业务逻辑处理
  • 差错处理模块:处理差错池中的订单

一般会设计一个定时任务,每天固定的时间点触发,定时驱动调度类分别调用四个模块来处理对账。也有的银行会主动的推送对账单,再通过http回调来触发对账流程。

对账算法

一、流程:… 阅读全文

树莓派 Raspberry Pi 更换国内源

  categories:资料  author:

树莓派的服务器实在太慢了!会导致你安装一个几M的东西都要等大半天!肿么办!
好在树莓派官方有提供一个镜像列表:http://www.raspbian.org/RaspbianMirrors”>树莓派的服务器实在太慢了!会导致你安装一个几M的东西都要等大半天!肿么办! 好在树莓派官方有提供一个镜像列表:http://www.raspbian.org/RaspbianMirro…

树莓派的服务器实在太慢了!会导致你安装一个几M的东西都要等大半天!肿么办!

好在树莓派官方有提供一个镜像列表:http://www.raspbian.org/RaspbianMirrors

面找到了几个国内的镜像一些软件无法更新,经过几番尝试,建议国内的阿里云更新源。

镜像主页:http://mirrors.aliyun.com/

阿里云镜像由阿里巴巴技术保障部基础系统组提供支持。

覆盖了Debian、Ubuntu、 Fedora、Arch Linux、 CentOS、openSUSE、Scientific Linux、Gentoo、Raspbian 等多个发行版的软件源镜像。

搭建此开源镜像的目的在于宣传自由软件的价值,提高自由软件社区文化氛围, 推广自由软件在国内应用。

同步频率为每天一次,每天凌晨2:00-4:00为镜像的同步时间

根据教程,咱们来编辑 /etc/apt/sources.list 文件。这里推荐用 nano 命令编辑。命令如下:

pi@raspberrypi:~$ sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak  #备份为 sources.list.bak
pi@raspberrypi:~$ sudo nano /etc/apt/sources.list     #编辑sources.list  文件

进入编辑界面,删除原有的内容或者用#注释掉原来的源,添加下方的源内容。

源如下:

deb http://mirrors.aliyun.com/raspbian/raspbian/ wheezy 
阅读全文


快乐成长 每天进步一点点      京ICP备18032580号-1