http://www.ox-holdings.com

我们开始扩容前端机集群新匍京娱乐场手机版,下面给出框架介绍

摘要即时通信云服务商LeanCloud 二零一六年1月二十四日因一组担负实时通讯服务数据计算的缓存机器发出故障,而导致雪崩引致即时通信服务瘫痪43分钟之久!以下音信来源于LeanCloud官方:5月 30 日晚上 8 点左右,大家的实时通信服务发生了故障,引致大气接受的终极客户不能登入和发送音信,时间持续约 40 分钟,详细意况汇总如下。故障时间二〇一四-06-14日 19:58 - 20:41(共计 43 分钟)影响范围LeanCloud 国内节点的实时通讯服务遭受震慑(不能登入和出殡和下葬音讯),此外服务不荒谬;美利坚合众国节点一切服务平常。事故经过19:58 一组担当实时通讯服务多少总括的缓存机器发出故障,导致客户登陆或发送音讯现身梗塞,相通操作起来消耗内部线程池财富;20:05 线程池能源耗尽,全体客户登入进度都会破产;20:22 分明了故障原因,开头重启缓存服务程序,然而服务程序所在机器因为压力过大失去响应,转而重启物理机械;20:33 缓存服务恢复生机平常,登入和发音讯等央浼起始恢复生机平常(为了加快我们新增加了一部分实时通讯服务程序,以追加响应工夫);20:41 实时通讯服务恢复平常。下图中的黄线是故障时段前后的记名央浼数量变化趋向曲线,与上述故障时间线适合:后续改善形式闲聊服务监察和控制程序改由 Marathon来机关陈设并执行。该监督程序因中期的三遍操作而被中止,结果不可能捕捉到此次服务特别,所以大家步向程序化的花招来作保其始终运作。(已成功)扩张对总括数据缓存服务的督查。(已到位)扩充对于登陆供给数极度变化的监察和控制。(已做到)进一层优化实时通讯服务的布局,针对具备环节做好容错,制止相符的隔膜操作再次现身。(11日内解决)即时通信云 LeanCloud 官网:

  • 09:08:存款和储蓄服务中间某一集群发猛烈件故障,引致 四分一的运用的蕴藏服务中断(约 19 分钟)。09:53 - 10:22:该集群受到流量冲击后品质减少并再次瘫痪(约 29 分钟)。前后共持续约 48 分钟。事故进程08:49:应用调控台现身报错,立时开展每种审核。08:56:开采有些集群硬件故障,导致集群品质不断回退,响应过于缓慢,到大约不可用。09:08:隔断故障机械和工具,重启相关服务后,集群稳步复苏了正规。09:53:有大批量连接涌入,拥塞了仓库储存系统的读写队列,使得该集群品质再度回降。09:58:该集群响应过于缓慢,大约不可用。初阶阻断连接,增加集群玉石俱焚启集群上的连带服务。10:22:集群服务日渐苏醒,一视同仁新开放连接。后续校勘格局提升对集群硬件退步的监察和报告急方。升高自动化故障管理技能,缩小系统 downtime 时间。尽快进级底层存款和储蓄系统的存款和储蓄引擎,减弱读写队列堵塞的大概,进一层晋级服务性质。LeanCloud官方地址:

摘要即时通信云 LeanCloud 十一月八日因一点点大客户量应用的高在线量而发生了有关服务故障,这几个难点相信不是第1次发出,也不会是最终二次。对于即时通信云服务商来讲,要想在财力和劳务品质上达到平衡,暂期内只可以是个梦。2014年 3 月 29 日晚间,LeanCloud 平台上的四个应用进行了拓展活动,大幅度增加的访问量给我们的多少存储和实时通讯服务带给了十分大压力。从 20:50 至 22:15 有再三流量高峰出现,我们多台 Web 服务器的互连网吞吐包超越虚构机的力量极限,内外网通讯中断,进而形成 HTTP 服务多次涌出间歇性故障(数据存储 API 以致依附于它的劳动也都间歇性不可用)。具体情形汇报如下:故障时间20:53 - 21:03(持续约 10 分钟)数据存款和储蓄 API 服务约 十分之五 的倡议超时。21:17 - 21:40(持续约 23 分钟)数据存款和储蓄 API 服务约 十分之五 的伏乞超时。22:00 - 22:15(持续约 15 分钟)数据存储 API 服务约 八分一的呼吁超时。故障总共持续约 48 分钟。影响范围这次故障只影响中华夏族民共和国节点,U.S.节点的持有服务均职业日常。在故障期间凡是向 LeanCloud 平台发送过诉求,并行使了多少存款和储蓄服务的风华正茂应用都饱受了震慑;大家的总括服务也在长期内不能不荒谬选拔来自选拔的风云反映。事故经过20:52:内部监察系统报警,突显三个Web 服务器节点现身故障。大家当下上线进行殷切管理,在去掉后端服务难题之后,最初根究前端财富和带宽分配的定额。21:03:由于有的行使流量下落,同期也是因为大家不经常急猛增添了讲话带宽,服务一时苏醒不荒谬。21:05:我们早先扩大体积前端机集群,以接待入下来可能再一次现身的流量高峰。21:17:前端机扩大容积时境遇了虚构机 OS 故障以致互联网景况难题,未能及时到位。当时正好部分选择又迎来叁遍流量高峰,前端机再一次吃紧。21:30:修复进程将近三小时,于是我们运维了通知和通报流程,在网易和顾客群里发出通报。21:40:流量自然降低,前端机再次复苏符合规律,大家的平台起首符合规律管理API 央求。22:00:线上部分前端机现身物理故障,大家又起来对它们进行急迫管理,时期有差不离1/8 的 API 需要错过。22:15:新的前端机节点经过手动管理后终于到达可用状态,并参预集群,实现了扩大容积,至此全体劳务到底被恢复生机。后续修改格局加码新的监督检查措施,对前端机互联网入包量实行监察,防止互联网转载量当先VM 技术范围。调解前端机 VM 配置,使用高包量机型,增大前端机的拍卖手艺。改良前端机扩大体量方式,使用 docker 镜像来加快新节点陈设上线的进程。文告流程中扩大短信布告门路,确定保证新闻立时布告到开辟者。

  转发请表明出处: 

三、可相信性设计

摘要即时通信云服务商LeanCloud 二零一四年6月十四日因由于突发硬件故障,招致雪崩以致即时通信服务瘫痪48分钟之久!以下新闻来源LeanCloud官方:7月 13 日凌晨 9 点左右,我们中间在应用中中原人民共和国节点的利用调节台时境遇报错,于是急迅便定位到某一集群由于突发硬件故障而引起存款和储蓄服务中断,经过抢修难题得以解决。大致一钟头后正当大家在这里起彼伏对该集群开展加固管理时,遽然遇上流量高峰,该集群的本性稳步下落并再一次发生了故障。此次故障影响到中中原人民共和国节点上 伍分一的利用不或许运用存款和储蓄及其信任服务,如实时通讯、云引擎等。美利坚联邦合众国节点不受影响。故障时间及范围08:49

2.伪异步式I/O创立的TimeServer源码分析

package joanna.yan.poio;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
/**
 * 伪异步式I/O
 * @author Joanna.Yan
 * @date 2017年10月24日上午10:16:10
 */
public class TimeServer {

    public static void main(String[] args) {
        int port=9090;
        if(args!=null&&args.length>0){
            try {
                port=Integer.valueOf(args[0]);
            } catch (Exception e) {
                // 采用默认值
            }
        }

        ServerSocket server=null;
        try {
            server=new ServerSocket(port);
            System.out.println("The time server is start in port :"+ port);
            Socket socket=null;
            //创建一个时间服务器类的线程池
            TimeServerHandlerExecutePool singleExecutor=new 
                    TimeServerHandlerExecutePool(50, 10000);//创建I/O任务

            while(true){
                socket=server.accept();
                //当接收到新的客户端连接时,将请求Socket封装成一个Task,然后调用execute方法执行。从而避免了每个请求接入都创建一个新的线程。
                singleExecutor.execute(new TimeServerHandler(socket));
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(server!=null){
                try {
                    System.out.println("The time server close");
                    server=null;
                    server.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

package joanna.yan.poio;

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
/**
 * 由于线程池和消息队列都是有界的,因此,无论客户端并发连接数多大,它都不会导致线程个数过于膨胀或者内存溢出,
 * 相比于传统的一连接一线程模型,是一种改良。
 * @author Joanna.Yan
 * @date 2017年10月24日下午2:39:49
 */
public class TimeServerHandlerExecutePool {
    private ExecutorService executor;

    public TimeServerHandlerExecutePool(int maxPoolSize,int queueSize){
        executor=new ThreadPoolExecutor(Runtime.getRuntime().availableProcessors(), 
                maxPoolSize, 120L, TimeUnit.SECONDS,
                new ArrayBlockingQueue<java.lang.Runnable>(queueSize));

    }

    public void execute(java.lang.Runnable task){
        executor.execute(task);;
    }
}

package joanna.yan.poio;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Date;

public class TimeServerHandler implements Runnable{
    private Socket socket;

    public TimeServerHandler(Socket socket) {
        this.socket = socket;
    }

    @Override
    public void run() {
        BufferedReader in=null;
        PrintWriter out=null;

        try {
            in=new BufferedReader(new InputStreamReader(this.socket.getInputStream()));
            out=new PrintWriter(this.socket.getOutputStream(), true);
            String currentTime=null;
            String body=null;
            while(true){
                body=in.readLine();
                if(body==null){
                    break;
                }
                System.out.println("The time server receive order:"+body);
                //如果请求消息为查询时间的指令"QUERY TIME ORDER"则获取当前最新的系统时间。
                currentTime="QUERY TIME ORDER".equalsIgnoreCase(body) ? 
                        new Date(System.currentTimeMillis()).toString() : "BAD ORDER";
                out.println(currentTime);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }finally{
            if(in!=null){
                try {
                    in.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
            if(out!=null){
                out.close();
                out=null;
            }
            if(this.socket!=null){
                try {
                    this.socket.close();
                    this.socket=null;
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

  伪异步I/O通讯框架选取了线程池达成,由此防止了为各样乞请都创制八个单身线程形成的线程能源耗尽难题。可是出于它底层的通讯照旧选拔一块窒碍模型,因而不能从根本上解决难点。

五、使用示例

caviar框架源码中的demo包中提供了三个大约的应用示例。

  • CaviarServerBootstrap为服务端的运转器,它达成了服务端结构及bind操作
  • CaviarClientBootstrap为客商端的运转器,它落成了客商端的构造及连接、登陆、发送央浼等操作
  • CaviarClientBizListenerDefaultImp和CaviarServerBizListenerDefaultImp为号令消息微电脑的作业达成类,demo里面只是做了简要的操作。

  前边讲到:Java IO编制程序全解(二)——古板的BIO编制程序

2、互连网服务端Server

Server接口提供bind方法和close方法。bind方法用于绑定对应服务端口并初叶监听客户端连接乞求,close方法为服务端关闭操作。

public interface Server {

    /**
     * 启动操作
     * @param port 监听端口
     */
    void bind(int port) throws CaviarNetworkException;

    /**
     * 关闭操作
     * @throws IOException
     */
    void close() throws IOException;
}

CaviarServer为Server接口的兑现类,提供CaviarServer(long timeout, CaviarServerBizListener caviarBizListenerState of Qatar布局方法。

  上边,我们构成一连模型图和源码,对伪异步I/O进行剖判,看它是还是不是能够减轻合营拥塞I/O面没有错主题材料。

2、音讯类型

    |-请求消息
        |-CLIENT_LOGIN_REQ(1001),                 //客户端登录
        |-CLIENT_LOGOUT_REQ(1002),                //客户端登出
        |-CLIENT_MSG_SEND_REQ(1003),              //客户端请求——同步
        |-CLIENT_MSG_SEND_ASYNC_REQ(1004),        //客户端请求——异步回调
        |-SERVER_MSG_SEND_REQ(1013),              //服务端请求——同步
        |-SERVER_MSG_SEND_ASYNC_REQ(1014),        //服务端请求——异步回调
    |-响应消息
        |-CLIENT_LOGIN_RESP(2001),                //客户端登录
        |-CLIENT_LOGOUT_RESP(2002),               //客户端登出
        |-CLIENT_MSG_SEND_RESP(2003),             //客户端请求
    |-心跳消息
        |-PING(9001),                             //客户端Ping
        |-PONG(9002),                             //服务端Pong

1. 伪异步I/O模型图

  选拔线程池和职务队列可以兑现一种叫做伪异步的I/O通讯框架,它的模型图如下所示。

  当有新的顾客端连着的时候,将顾客端的Socket封装成三个Task(该职责完毕java.lang.Runnable接口)投递到后端的线程池中进行管理,JDK的线程池维护三个新闻队列和N个活跃线程对音讯队列中的任务进展管理。由于线程池能够安装音信队列的朗朗上口和最大线程数。由此,它的能源占用是可控的,无论多少个顾客端并发访谈,都不会以致能源的耗尽和宕机。

新匍京娱乐场手机版 1

图1 伪异步I/O服务端通信模型(M:N) 

  上面大家照样选拔时间服务器程序,将其改形成为伪异步I/O时间服务器,然后通过对代码举办剖析,搜索其破绽。

1、顾客端连接/诉求超时效用:

  • Client接口提供出来的connect/sendMsgSync/sendMsgAsync方法均帮忙过期时间的安装,超时时间为CaviarServer(long timeout, CaviarServerBizListener caviarBizListener卡塔尔(قطر‎结构方法的timeout字段。
  • 当顾客端连接/央求超时时,将抛出CaviarNetworkException进行提示。

郑重声明:本文版权归新匍京a奥门-最全网站手机版app官方下载所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。