HDU 5017 Ellipsoid 模拟退火第一开

作为一个移动端开发人员来讲,是蛮为难接触到后端项目架构的,所幸,从2015年开班,负责部分管理工作,参与了色架构相关的行事。项目由小至异常,架构也越加复杂,特别是近年开的一个跨国型项目,涉及到境内国外服务器的布,尤为复杂。本文结合这些品种推行,介绍因阿里云的后端架构设计。(有些情节吧援他人的文章,文中已产生认证,咱是注重版权的

为填补立即书,特意学了生模拟退火算法,感觉算法本身不是非常为难,就是唯恐降温系数,步长等参数不好设置。

1.基础架构:

2015年初,团队召开了一个美味项目,业务逻辑比较简单,主要是落实用户、餐馆、美食三元素的增删改查及三者之间的涉及查询。后端程序用的是php,前端面对的凡iOS和Android两款App。当时购买了同一玉阿里云ECS服务器,在该服务器上安了MySQL以用来数据存储。应用程序、数据库、文件等有资源都以一如既往大服务器上,网站架构使下图所示:

基础架构.jpg

夫架构简单,适用于路前期,访问量比较小场面。这里正至关重要说一下底是,此路受到干到资源文件的囤但并不曾用到OSS服务器,我们的做法是于客户端在上传图片文件的时,接口程序会将图片压缩也所急需的多尺码,并保存在对应的文书夹下,前端再得到图片的时候在URL后拼接对于的尺寸即可访问。如客户端上传了一致张图纸,程序会回落为3030,120120,240*240老三种尺寸,客户端根据界面需要使用xxxxx_30.png的不二法门访,这个职能于阿里云底OSS服务器上发生现成的服务,无需好抽。

切实学习好瞻仰: http://www.cnblogs.com/heaad/archive/2010/12/20/1911614.html 
我以为说的要命科学,通俗易懂。

2.运用与数分离架构:

2015年的,团队初步开了一个图片社交类,其作用是全方位效仿Instagram,但是内容要针对的是衣物、奢侈品。用户通过手机拍照片奢侈品、服装相关的视频、图片,并丰富对应之下载链接,发布到阳台后,用户可看来任何具有人宣布的情,并可以依据链接打。
斯项目面临干到大气视频、图片的处理,这里我们实现了应用服务、数据服务、资源服务之分别。我们买了季大阿里云服务器,分别是简单高ECS、一高OSS、一宝RDS,其组织要下图:

分离.png

当即书设置一个step为1,降温系数也0.99,因为系数越充分,得到最优解的几率越怪,虽然可能会慢一点。因为凡三维的,所以向八只方向扩张找邻域解,然后遇到比他出色的免一定接受。

3.集群式部署初级架构

2016年我们开开一个特大型的在线教育平台型,经历一样年之磨合,项目趋于稳定,我们的服务器架设也改善。本想总结一下服务器的架构,在挥洒之前在网上看了他人总结的一律篇文章,类型架构设计总结,再此先往笔者表示敬意,以下是援的当下首文章的有的情节:

种背景

路之前端主要也ios应用以及部分web管理体系,后端的功用要也前端提供数据接口。我个人以品种中要害担负整个后端的架构设计、服务器运维、php开发等一样文山会海后端工作,因为根本是自个儿一个人数顶,在一定水平上呢抽了累累牵连成本。

完整架构

路后端架构下阿里云服务搭建,其中RDS为中心集群,并配置灾备实例。ECS可依据业务量动态弹性伸缩,其余服务均运用单实例的方法远程调用。

2104726472.png

VPC

搭建VPC的原故产生以下几点
1.足以拿工作数据库暨事务服务器放置于足自己左右的同等内网,可以增强部分安全性。
2.阿里云劳务中间通过内网访问的流量是休收费的。所以于买服务经常,带富得选择流量版,这样在包带宽速率的以,还好极大的抽运维费用。
选举个例子:同样一致令ECS,在和为百兆带宽的图景下,每月的花费要下图:

依照一定带富

[图上传中…(4282504957.png-8d5eea-1513671576852-0)]

遵循动流量

4282504957.png

当然,能如此的召开的故吧是以当此架构中,ECS仅处理事情逻辑,几乎未存储文件资源。大部分静态资源,如视频图片等,都是储存在OSS上。如果存放静态资源,比如下视频或图片什么的,流量一多那么便挺亏了。
3.内网走访,稳定而速度快。

事情数据层

RDS

色雷同开始,RDS选购的是共享型单实例的,随着业务量的升级,可以基本上区域布局只是念实例。另外,保险起见,主实例可以下放起一个灾备实例,防止意外发生。

Redis

波及阿里云的斯Redis,不得不吐槽同样句,它甚至是勿支持中心的,只能单实例,不过,用它们做多少缓存,还算殊不错的选料,响应速度非常快。而且,因为凡停在内网的都只能内网访问,所以安全性也生高。

MongoDB

结构型数据,主要囤积档案式的数据,比如每个用户之操作行为,以档案式记录并开展统计分析,方便下一阶段的种类开个性化服务。另外一些事关复杂的数码,也可以用MongoDb存储,可以增强访问速度。还有,一些对准软件应用版本比较敏感的多寡也得是MongoDB中,比如a版本将到A数据,b版本用到B数据,而以此AB数据都是由于众多涉嫌关系错综复杂的数码所构成,如果把这些数据因本号囤于不同之MongoDB档案被,需要时,直接冲版本号拿就可以了,这样即使避免了多的mysql查询。

静态资源

OSS + CDN
OSS存储静态资源,CDN(内容分发网络)可以加速静态资源的下载速度。至于资源链接地址,客户端可透过接口访问于后端业务数据库被以到。
服务器安全

运维层面
1.市了阿里云的web防火墙和神态感知的劳务。这半个劳务可实时监察服务器状态,识别并跟踪攻击源与项目,可以说,用当下点儿独器为省去了广大人工财力。阿里云还来另外安全类产品,可以根据项目选购,使用起来为还死便宜。
2.配置firewalld。

政工规模
针对接口访问的安全性,主要做了以下工作
1.署验证:防止伪造请求
2.做客频次限制:计数器是故phpredis制作的毫秒级计数器
3.https访问
4.片段敏感数据,使用RSA非对如加密

服务器集群

主ECS

由此这台ECS,可以管理其它从属的ECS,并查看状态。安装之重要性工具为ansible。
假设无欲为此这令ECS来举行负载均衡的口舌,可以配备白名单连接,只允许管理员ip才会顾。

从属ECS

随即仿佛ECS服务器就存放逻辑代码,所以当需求量多时,只待追加此类服务器的个数即可。而且,在多个数时,可以应用前做好之镜像,创建多贵同样环境的ECS服务器。每台ECS的web环境呢nginx1.10跟php7,微服务容器环境从而底docker。

负载均衡

负载均衡得动用简单种方式
1.购进阿里云的负载均衡实例(注意要采购带公网ip的)。由该负载均衡实例接收请求后,会散发至内服务器。
2.以某台具有外网ip的ECS上采用nginx部署负载均衡服务。

私家还倾向第一种植,毕竟管理起来比有利,节省人力。

动到的老三在服务

Coding

后端的有代码都是身处Coding上之,喜欢Coding的因来三单。
1.私产生git仓库没有个数限制。
2.发出ios客户端且比较好用。
3.操作界面好看。

后端代码的自行部署是透过Coding的webhook实现的
具体操作可以错过押即首博客《利用Coding的webhook自动部署项目》。

落实的场景:代码的机关部署以及随地集成。
当自家付诸代码到出分支上时时,测试服务器上会自动更新开发分支上之代码。
当自家将开代码合并到主分支上常,正式服务器会活动拉取master分支上的代码,可谓是方便快捷。
jenkins
之类的工具则为尝了,但是觉得部署起来老不便利,不够定制化,而且还吃了同有些服务器资源。

后端逻辑层架构

接口

项目开始的接口是依据phalapi框架开发,现在日渐过渡至基于laravel5.3开发。
色开始选择phalapi的原故

1.phalapi框架是轻量级的接口发框架,开发起来比轻便、快速,尤其是蛮依赖注入挺好用底。
2.phalapi框架来成百上千成的恢宏可以采用,不用失去寻找,而且这些吗能够基本满足工作的内需。我个人还因这个框架开发了区区个扩大,一个是关于用workman的,一个凡是有关以gearman的。

内部gearman是为此来异步处理要的,详细介绍好扣押即篇博客《基于Phalapi框架的gearman扩展(异步并发)》
因业务量增长性

http请求的起性能好经多ECS实现,针对有耗时于丰富都不要即经常回调的请求,可以用gearman异步处理。
数据库的连发连接数可以由此长部署来增长,也足以通过创设只读实例进行读写分离,提高多少处理能力。再于后,可能要搭建hadoop管理数据库集群,不过当用上hadoop的当儿,应该已经休是路前期了,至少数据量得是TB级的了。
其它还好下优化nginx配置,优化linux内核,采用高效固态硬盘等等的招。

小结评价

当下套架构基本上可以了满足项目初期的事务需要,而且富有的说服务资费总额也深少(相比于由盖服务器机房)。随着业务量的晋升,可以逐步升级配置为承诺本着急需,还得在缺乏日外临时的增高并发处理能力。总结起来便是看看钱、省时、省力气。

代码:(参照网上代码)

4.集群式部署国际化架构

乘胜工作的扩张,最近我们的型要发布暨天涯海角市场,原有的服务器架设已不能够满足市场之需求。由于之前未曾接触这么好的品类,对远方市场服务器的配置十分不打听,在和阿里云架构师沟通的基本功及,我们得有些许种植缓解方案:

方案一:
阿里云有同缓缓给世界加速的产品,该产品并非买和部署海外服务器,只待购买全球加速服务,阿里云接抱其打盖之天下中心网络,据说可实现海外访问100ms的延时。不过这种办法,成本比高,我们挑选了放弃,其组织使下图:

普天之下加速.png

方案二:

亚种植方案就是当角落部署服务器,其布局使下图:

集群式服务器结构.png

当达到一致栽架构的根基及,在所需要的触及购买ECS服务器,海外节点通过香港进口访问国内的RDS和Redis。同时以远方对应之节点部署CDN,用于访问OSS服务器时的加速,海外用户访问对承诺节点的CDN,CDN通过香港输入访问OSS服务器,并拿所走访的目标文件缓存到相应的节点,当用户下次更访问该目标时,直接由对应的CDN节点缓存中收获,以此方式增强访问速度。

图片 1图片 2

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cmath>
#define Mod 1000000007
#define eps 1e-8
using namespace std;

int dx[8] = {0,0,1,-1,1,-1,1,-1};
int dy[8] = {1,-1,0,0,1,1,-1,-1};
double a,b,c,d,e,f;

double dis(double x,double y,double z)
{
    return sqrt(x*x + y*y + z*z);
}

double calc(double x,double y)
{
    double A = c;
    double B = d*y+e*x;
    double C = f*x*y + a*x*x + b*y*y - 1.0;
    double delta = B*B-4.0*A*C;
    if(delta < 0.0) return Mod+10.0;    //不在椭球上
    delta = sqrt(delta);
    double soz1 = (-B + delta)/(2.0*A);
    double soz2 = (-B - delta)/(2.0*A);
    if(dis(x,y,soz1) < dis(x,y,soz2))
        return soz1;
    return soz2;
}

double Simulated_Annealing()
{
    double x = 0,y = 0,z = sqrt(1.0/c);  //当前最优解
    double step = 1.0, rate = 0.99;
    while(step > eps)
    {
        for(int k=0;k<8;k++)
        {
            double kx = x + step*dx[k];
            double ky = y + step*dy[k];
            double kz = calc(kx,ky);
            if(kz >= Mod) continue;
            if(dis(kx,ky,kz) < dis(x,y,z))
            {
                x = kx,y = ky,z = kz;
            }
        }
        step *= rate;
    }
    return dis(x,y,z);
}

int main()
{
    while(scanf("%lf%lf%lf%lf%lf%lf",&a,&b,&c,&d,&e,&f)!=EOF)
    {
        printf("%.7f\n",Simulated_Annealing());
    }
    return 0;
}

View Code