分布式技术

微服务实践:分布式锁

久未见 提交于 2019-11-30 06:24:34
微服务实践:分布式锁 分布式锁   单体应用下,使用锁机制可以解决多线程同步问题。而在, 集群环境下,单个服务有多个实例,每个实例都在自身JVM内做了同步,却不能保证整体服务的同步,这个服务依然是紊乱的 。    分布式与集群   下图来自知乎作者(大闲人柴毛毛),      单机处理到达瓶颈的时候,你就把单机复制几份,这样就构成了一个“集群”。集群中每台服务器就叫做这个集群的一个“节点”,所有节点构成了一个集群。每个节点都提供相同的服务,那么这样系统的处理能力就相当于提升了好几倍(有几个节点就相当于提升了这么多倍)。   但问题是用户的请求究竟由哪个节点来处理呢?最好能够让此时此刻负载较小的节点来处理,这样使得每个节点的压力都比较平均。要实现这个功能,就需要 在所有节点之前增加一个“调度者”的角色,用户的所有请求都先交给它,然后它根据当前所有节点的负载情况,决定将这个请求交给哪个节点处理。这个“调度者”有个牛逼了名字——负载均衡服务器 。   分布式结构就是将一个完整的系统,按照业务功能,拆分成一个个独立的子系统,在分布式结构中,每个子系统就被称为“服务”。这些子系统能够独立运行在web容器中,它们之间通过RPC方式通信。 可重入锁   举例说明可重入锁: public class UnReentrant{ Lock lock = new Lock(); public void

Redis:Redis的概念及各项功能

时光怂恿深爱的人放手 提交于 2019-11-30 05:45:11
Redis:简述Redis 的概念及各项功能 一、Redis简介 官方简介:Redis是一个基于BSD开源的项目,是一个把结构化的数据放在内存中的一个存储系统,你可以把它作为数据库,缓存和消息中间件来使用。 同时支持strings,lists,hashes,sets,sorted sets,bitmaps,hyperloglogs和geospatial indexes等数据类型。 它还内建了复制,lua脚本,LRU,事务等功能,通过redis sentinel实现高可用,通过redis cluster实现了自动分片。以及事务,发布/订阅,自动故障转移等等。 综上所述,Redis提供了丰富的功能,这些功能都是干嘛用的?都解决了什么问题?什么情况下才会用到相应的功能?那么下面来粗略的解释下。 二、面临的需求(问题)及解决方案 需求(问题) :我们有一个提供热点新闻列表的api接口,api的消费者抱怨说每次请求都要2秒左右才能返回结果。随后我们就着手于如何提升一下api消费者感知的性能。 基于HTTP的缓存控制 很快最简单粗暴的第一个方案就出来了:为API的响应加上基于HTTP的缓存控制 cache-control:max-age=600 ,即让消费者可以缓存这个响应十分钟。如果api消费者如果有效的利用了响应中的缓存控制信息,则可以有效的改善其感知的性能(10分钟以内)。

分布式跟踪系统-cicada

好久不见. 提交于 2019-11-30 04:49:14
https://github.com/Yirendai/cicada/blob/master/cicada-docs/cicada_design.md 背景与目标 面对日趋复杂的分布式系统,如服务框架、消息中间件、缓存、数据层等,我司在业务性能瓶颈定位、故障排除等方面效率低下,生产环境中没有成熟的Trace工具,我们认为分布式跟踪系统适合且急需引入公司内部。 Trace系统需要能够透明的传递调用上下文,理解系统行为,理清后端调用关系,实现调用链跟踪,调用路径分析,帮助业务人员定位性能瓶颈,排查故障原因等;同时,需要对用户尽量透明,减少对业务代码的侵入性。 我们的Trace系统为解决以上问题而设计。 理论依据 目前可查的分布式跟踪系统,设计思想都源于Google的论文《Dapper, a Large-Scale Distributed Systems Tracing Infrastructure》。 现有Trace系统调研 调研期间,我们同时参考了其他互联网企业分布式跟踪系统的原理以及应用场景,例如阿里的Eagle eye,Twitter的Zipkin,京东的hydra以及点评的CAT。 Google Dapper && Alibaba Eagle eye 从实现来看,阿里的实现最接近Dapper论文中提到的方式。 Eagle eye架构如下图所示: 日志收集方式 记录本地文件

《即时消息技术剖析与实战》学习笔记7——IM系统的消息未读

半世苍凉 提交于 2019-11-30 03:38:32
一、什么是消息未读 消息未读包括 会话未读 和 总未读 。前者指的是当前用户和某一聊天方的未读消息数,后者指的是当前用户的所有未读消息数,也就是所有会话未读的和。比如用户A收到用户B的2条消息,还收到用户C的3条消息,则用户A与B的会话未读数是2,用户A与C的会话未读数是3,用户A的总未读是5。 二、消息未读的维护 会话未读和总未读数一般都是单独维护的。这是因为: 1)总未读的使用场景较多,会被高频使用。如APP角标未读展示; 2)如果不单独维护,则总未读数需要通过计算所有的会话未读数,一旦会话数较多,就需要多次读取存储,多次获取累加的操作容易出现性能瓶颈。而且一旦发生超时等意外,就会无法获取到会话未读数,导致总未读数不准确。 三、消息未读的一致性 单独维护总未读和会话未读数会带来新问题,也就是消息总未读数与(多个)会话未读数不一致的问题。比如APP角标显示5,表示有5条未读消息,但用户点进去却发现没有新消息或只有3条消息,就会给用户造成不好的体验。 消息未读不一致的原因 用户B的初始状态:会话未读数和总未读数都是0。 用户A给用户B发消息,消息到达IM服务后,执行加未读操作:先把用户B与用户A的会话未读数加1,再把用户B的总未读数加1,然后消息推送给用户B。 case1 :假设加会话未读数的操作成功、加总未读数的操作失败了,则用户B的最新状态是:会话未读数是1,总未读数是0。

浅谈分布式锁

蹲街弑〆低调 提交于 2019-11-29 23:42:01
张岩 张岩,2016年加入京东,熟悉大型分布式系统设计及开发,有丰富的web开发实战经验,对spring等开源框架有源码级了解,目前主要负责京麦插件市场及交易平台的研发工作。 前言 随着互联网技术的不断发展,数据量的不断增加,业务逻辑日趋复杂,在这种背景下,传统的集中式系统已经无法满足我们的业务需求,分布式系统被应用在更多的场景,而在分布式系统中访问共享资源就需要一种互斥机制,来防止彼此之间的互相干扰,以保证一致性,在这种情况下,我们就需要用到分布式锁。 分布式一致性问题 首先我们先来看一个小例子: 假设某商城有一个商品库存剩10个,用户A想要买6个,用户B想要买5个,在理想状态下,用户A先买走了6了,库存减少6个还剩4个,此时用户B应该无法购买5个,给出数量不足的提示;而在真实情况下,用户A和B同时获取到商品剩10个,A买走6个,在A更新库存之前,B又买走了5个,此时B更新库存,商品还剩5个,这就是典型的电商“秒杀”活动。 从上述例子不难看出,在高并发情况下,如果不做处理将会出现各种不可预知的后果。那么在这种高并发多线程的情况下,解决问题最有效最普遍的方法就是给共享资源或对共享资源的操作加一把锁,来保证对资源的访问互斥。在Java JDK已经为我们提供了这样的锁,利用ReentrantLcok或者synchronized,即可达到资源互斥访问的目的。但是在分布式系统中

分布式架构理论篇

拟墨画扇 提交于 2019-11-29 23:11:25
大型分布式系统原理概述 分布式系统三要素 ​ CPU:处理器 ​ Memory:内存 ​ IO:外存 ​ MultiCore:多核心 ​ LocalDisk:本地磁盘 ​ Networker:网络,网络存储 ​ RDMA:远程内存直接访问 ​ NUMA:分布式系统CPU和内存进行整合,对内存进行捆绑,是硬件层级的,(相似与ThreadLocal,将数据和实时运行线程绑定到一起),网卡直接绕过CPU共享内存,速度非常快 ​ 分布式系统三要素的进化 ​ 桌面级八核心十六线程CPU于2014年诞生,2015年Intel预计发布18核心桌面级CPU ​ NUMA在大中型系统上一直非常盛行,NUMA能很好提升系统吞吐能力,特别对于Java以及数据这样占用大内存的系统,但一直以来没有得到 DBA 们足够的重视、 Java领域也很少有人研究 ​ RDMA(远程内存直接访问,网络传输协议,类似TCP,更低延迟)是超高性能计算UHPC的重要基础之一,而Direct Socket Protocol (SDP)作为RDMA的传输协议已经在很多关键领域取代了TCP,Java7也正式开始支持SDP,跨入了UHPC的领地。 ​ IO方面,万兆网正在崛起,万兆网的ISCSI存储, 单通道可达到500MB/s, 每秒500,000个IO能力,而目前主流的SSD硬盘的速度是400-550MB/s。 ​ ===

区块链学习之一:区块链技术与基本原理

隐身守侯 提交于 2019-11-29 22:02:20
区块链是分布式数据存储、点对点传输、共识机制、加密算法等计算机技术的新型应用模式。区块链(Blockchain),它本质上是一个 去中心化的数据库 ,同时作为比特币的底层技术,是一串使用密码学方法相关联产生的数据块,每一个数据块中包含了一批次比特币网络交易的信息,用于验证其信息的有效性(防伪)和生成下一个区块。 基本含义 : 狭义来讲,区块链是一种按照时间顺序将数据区块以顺序相连的方式组合成的一种链式 数据结构 , 并以密码学方式保证的不可篡改和不可伪造的分布式账本。 广义来讲,区块链技术是利用块链式数据结构来验证与存储数据、利用分布式节点共识算法来生成和更新数据、利用密码学的方式保证数据传输和访问的安全、利用由自动化脚本代码组成的智能合约来编程和操作数据的一种全新的分布式基础架构与计算方式。 区块链系统与结构: 基础架构模型: 一般说来,区块链系统由数据层、网络层、共识层、激励层、合约层和应用层组成。 数据层封装了底层数据区块以及相关的数据加密和时间戳等技术; 网络层则包括分布式组网机制、数据传播机制和数据验证机制等; 共识层主要封装网络节点的各类共识算法; 激励层将经济因素集成到区块链技术体系中来,主要包括经济激励的发行机制和分配机制等; 合约层主要封装各类脚本、算法和智能合约,是区块链可编程特性的基础; 应用层则封装了区块链的各种应用场景和案例。 该模型中

大数据核心技术

北城以北 提交于 2019-11-29 20:49:16
原地址:http://bigdata.idcquan.com/dsjjs/159544.shtml 大数据 技术的体系庞大且复杂,基础的技术包含数据的采集、数据预处理、分布式存储、NoSQL数据库、数据仓库、机器学习、并行计算、可视化等各种技术范畴和不同的技术层面。首先给出一个通用化的大数据处理框架,主要分为下面几个方面:数据采集与预处理、数据存储、数据清洗、数据查询分析和数据可视化。 一、数据采集与预处理 对于各种来源的数据,包括移动互联网数据、社交网络的数据等,这些结构化和非结构化的海量数据是零散的,也就是所谓的数据孤岛,此时的这些数据并没有什么意义,数据采集就是将这些数据写入数据仓库中,把零散的数据整合在一起,对这些数据综合起来进行分析。数据采集包括文件日志的采集、数据库日志的采集、关系型数据库的接入和应用程序的接入等。在数据量比较小的时候,可以写个定时的脚本将日志写入存储系统,但随着数据量的增长,这些方法无法提供数据安全保障,并且运维困难,需要更强壮的解决方案。 Flume NG作为实时日志收集系统,支持在日志系统中定制各类数据发送方,用于收集数据,同时,对数据进行简单处理,并写到各种数据接收方(比如文本,HDFS,Hbase等)。Flume NG采用的是三层架构:Agent层,Collector层和Store层,每一层均可水平拓展。其中Agent包含Source

分布式缓存-01概览

房东的猫 提交于 2019-11-29 19:02:25
01分布式缓存概览 使用原因 为什么要使用分布式缓存,很简单的一点你当前的系统性能已经不适用于你的业务量就不得不升级你的系统提高系统性能,从哪几个方面提高,优化代码,优化数据库,使用静态数据,只有在单机已经没有办法满足业务的情况下才会去考虑集群然后才是分布式 分布式意味着你要将原来的系统拆分成多个服务,这就涉及到服务之间的调用以及数据的一致性问题。将单机变为分布式以后,系统的性能并发有了足够的提升但是数据库的压力大了起来大量的数据库I/O操作消耗大量的资源。怎么减轻数据库的压力,把从磁盘读的 数据放到内存减少磁盘I/O操作也就是缓存,把缓存分到多台服务器就是分布式缓存。 应用场景 01-页面缓存 我们在访问某一个网站的时候,请求发送到后台,后台从数据库查询到数据后并进行渲染之后返回,这个过程的资源消耗在数据的读取和渲染,所以需要在进入读数据之前从缓存中找缓存中没有再从数据库查询渲染并存入缓存 02-状态缓存 解决分布式Web部署的session同步问题,状态缓存.缓存包括Session 会话状态及应用横向扩展时的状态数据等,这类数据一般是难以恢复的,对可用性要求较高。 03-并行处理 分布式计算中,中间数据的共享问题 04-事务处理 分布式事务的数据在缓存与数据库中的一致性问题 06-热点数据 在并发量大的系统中,访问频率高的热点数据 应用技术 07-Ehcache

基于Redis实现分布式消息队列

孤者浪人 提交于 2019-11-29 18:50:38
基于Redis实现分布式消息队列 原文地址: http://blog.csdn.net/stationxp/article/details/45731497 ) 1、为什么需要消息队列? 当系统中出现“生产“和“消费“的速度或稳定性等因素不一致的时候,就需要消息队列,作为抽象层,弥合双方的差异。 举个例子:业务系统触发短信发送申请,但短信发送模块速度跟不上,需要将来不及处理的消息暂存一下,缓冲压力。 再举个例子:调远程系统下订单成本较高,且因为网络等因素,不稳定,攒一批一起发送。 再举个栗子,交互模块5:00到24:00和电商系统联通,和内部ERP断开。1:00到4:00和ERP联通,和电商系统断开。 再举个例子,服务员点菜快,厨师做菜慢。 再举个例子,到银行办事的人多,提供服务的窗口少。 乖乖排队吧。 2、使用消息队列有什么好处? 2.1、提高系统响应速度 使用了消息队列,生产者一方,把消息往队列里一扔,就可以立马返回,响应用户了。无需等待处理结果。 处理结果可以让用户稍后自己来取,如医院取化验单。也可以让生产者订阅(如:留下手机号码或让生产者实现listener接口、加入监听队列),有结果了通知。获得约定将结果放在某处,无需通知。 2.2、提高系统稳定性 考虑电商系统下订单,发送数据给生产系统的情况。 电商系统和生产系统之间的网络有可能掉线,生产系统可能会因维护等原因暂停服务。