在若干次前的一场面试,面试官看我作过python
爬虫/后端 的工做,顺带问了我些后端相关的问题:你以为什么是后端?php
送命题。当时脑瓦特了,答曰:逻辑处理和数据增删改查。。。html
Redis
、
Elasticsearch
和
DNS
等其实都属于后端知识体系范畴。
在本文中,我将尝试总结前端须知的后端体系入门。前端
不管你的动机是什么,这个体系里都有你想要了解或学习的东西:vue
本文目录:node
Web / Application Servers
Web Servers
服务器:Web服务器,使用http
协议向Web提供内容。Application Servers
:应用程序服务器,托管并公开业务逻辑和进程。Node.js,Python,PHP,Java,C#
或Ruby
。而事实上,每一个后端语言都有不同的特性,也都有各自的拥护者。哪个语言最适合作为后端语言的入门一直都是没有定论的问题。但为了让咱们能够对各语言有一个很简单的概念,如下整理了各语言较常被说起的特点、在开发上比较被人诟病的点,以及有什么样的网站是透过该语言开发的:python
PHP
:nginx
Facebook
、Wordpress
、新浪微博。Java
:git
Linkedin
、Amazon
、淘宝。Ruby
:github
Airbnb
、Twitter
。Python
:web
Instagram
、Reddit
、知乎。JavaScript (Node.js)
:
Yahoo
、Walmart
Go
:
Google
力推,有很完善的标准库,效能强大堪比C系列。Google
、Youtube
、哔哩哔哩、头条、腾讯云Web Server
,除了托管自定义应用程序代码以外,一些Web应用程序体系结构还使用“Web服务器进程”,例如
Apache HTTP Server
或
Nginx
。这些服务器进程将在访问后端代码以前拦截客户端请求。使用它们有如下几个缘由:
CSS
,JS
)比经过后端代码访问更快。PHP
)没有内置的生产级Web
服务器,所以须要经过专用的Web
服务器进程启动。至此,会引出一个疑问:Apache
、Nginx
、Tomcat
和Node.js
四者的区别是什么?
是一类东西,又不是一类东西。
Web服务器
,可是他们关注的点不同。
Tomcat
只能跟 Java
配合,Node.js
只能跟JavaScript
。Apache
能和其余语言配合(一般跟 PHP
配合居多),但须要借助不一样的模块。Nginx
则是经过端口转发,因此Apache
和Nginx
能够和各类编程语言一块儿使用Nginx
和Apache
是纯web
服务器,不具有解析动态语言(好比php文件和js文件)的能力.Tomcat
和Node.js
可以解析这些脚本语言,提供应用服务,Web Server
算是附加的功能。安装这些工具和后端项目的Web
服务器计算机,自己能够采用如下几种形式:
VPS其实是被划分为几个部分的独立服务器,每一个部分做为单独的VPS服务器进行销售和使用。也就是说,它是一台可运行多个Web应用程序(网站、软件等)的相对独立的机器,每一个用户拥有部分资源。
VPS
是基于软件层的虚拟化技术,具体来讲就是操做系统的虚拟化,VM
是基于硬件层的虚拟化技术,VM
主机使用vmware server
搭建。
用个类比来极简说明一下:
1. 物理机是这样的:
2. 虚拟机是这样的:
3. Dokcer是这样的:
Load Balancer
负载均衡是高可用网络基础架构的的一个关键组成部分,有了负载均衡,咱们一般能够将咱们的应用服务器部署多台,而后经过负载均衡将用户的请求分发到不一样的服务器用来提升网站、应用、数据库或其余服务的性能以及可靠性。
负载平衡器模型一般分为两类:第4层(传输层)和第7层(应用层)。
第4层(传输层)::
第7层(应用层)::
负载均衡器主要分为硬件负载均衡和软件负载均衡两大类。
LVS
、Nginx
和HAproxy
两种类型的负载平衡器都会收到请求,并根据配置的算法将这些请求分发到特定的服务器。一些行业标准算法是:
Round robin,RR
Weighted round robin,WRB
Least connections
Least response time
在Web
应用程序中使用负载均衡器有两个主要好处:
Web
服务器不会被全部请求淹没,来帮助维持一致的响应时间,所以处理每一个请求的速度会相对慢些。DNS
当用户在其地址栏中输入URL
时,浏览器将获取URL
的域部分(例如www.google.com
)并调用DNS 。DNS解析发回该网站服务器的IP地址位置(例如172.217.23.4)。一旦它具备IP地址,它就能够发送对网页的实际请求。
大多数互联网域名注册服务(例如GoDaddy
,万网等)都提供DNS管理控制台。这些容许你配置域名(和子域)以指向应用程序的位置。
若是你愿意,还能够将您的域名服务器转移到阿里云、腾讯云等云提供商,并从那里进行管理。这样作的好处是能够将全部应用程序环境配置保存在一个位置,并使其更易于自动化。
HTTPS / SSL
证书若是你正在构建Web应用程序(或静态网站),则须要经过HTTPS提供服务,以确保用户与服务器之间的安全通讯。如今使用HTTPS
也有SEO
的好处,因此没有理由不使用它。
这意味着须要在后端安装SSL证书。具体来讲,须要在任何服务器上安装它们,这是客户端请求的第一个联系点。这一般意味着负载均衡器和CDN服务器,但若是你没有使用负载均衡器,也多是应用程序服务器。
LetsEncrypt
免费生成证书。AWS Certificate Manager
。这容许你建立并自动续订SSL证书并将其分发到应用程序服务器,负载平衡器和CDN服务器。HTTPS
证书受权中心才会被浏览器认可,不然会显示为不安全,须要手动信任。目前SSL证书根据验证级别分为三种类型
几乎全部Web应用程序都须要在某处保留数据。在大多数状况下,某处即某种形式的数据库。 数据库的主要工做是将数据可靠地保存到永久存储器中,并容许经过查询检索数据。它还能够围绕它存储的数据结构强制执行一些规则约束。
早期比较流行的数据库模型有三种,分别为层次式数据库、网络式数据库和关系型数据库。
而在当今的互联网中,最经常使用的数据库模型主要是两种,即关系型(SQL)数据库和非关系型(NoSQL)数据库。
MySql,Postgres,SQLServer,Oracle,SQLite
)已经存在了40多年,而且一直是大多数Web应用程序的支柱。你能够在一台服务器上托管数据库,但在生产方案中更常见的是将其托管在某种形式的集群2台或更多服务器上。这可确保数据库具备高可用性并下降数据丢失的风险,例如,若是一台服务器的存储损坏。
近年来,少数云托管的“无服务器数据库”已经可用。这些是能够经过API调用的数据库,但你无需设置服务器来托管它们。除了处理诸如自动备份之类的事情以外,云供应商还为您无形地执行此操做。这些示例包括DynamoDB(NoSQL)
,Firebase
实时数据库(NoSQL
)和Aurora
无服务器(关系)。
不管底层是关系型数据库,仍是NoSQL数据库,不管是 Mysql 仍是 Redis、MongoDB,在架构设计上都是相通的。
数据库服务器的基础方案分为三种:
主备式架构是双机部署中最简单的一种架构,几乎市面上全部的数据库系统都会自带这个主备功能。
其思路也特别的简单:
这个架构的优缺点都很明显,优势就是几乎不须要作什么开发改造,各种数据库就支持这种模式,部署维护起来也简单,并无引入额外的系统复杂度和瓶颈。
可是缺点呢,就是当「主机」出现故障的时候,须要人工去干预啊,运维同窗很辛苦的,并且处理还不必定及时。再还有一个缺点就是,主备架构会形成严重浪费资源,毕竟须要一台与「主机」同等配置的「备机」长期备着,但又不做为线上服务来使用,你说浪费不浪费。
为了解决这个资源浪费问题,咱们就得想一个把「备机」也用起来的方案:主从式架构。
主从式架构大致上与上述的主备式架构差很少。区别就是主备式的「备机」平时是不干活的的,主要起到备份的做用。而主从式的「备机」改成了「从机」,平时也要提供服务,跟「主机」同样随时随刻的在干活的。
互为主从的架构是指两台机器本身都是主机,而且也都是做为对方的从机。两台机器都提供完整的读写服务,所以无需切换,客户机在调用的时候随机挑选一台便可,当其中一台宕机了,另一台还能够继续服务。
至于数据库集群方案,我暂时没看懂,就不写了。。。
Blob
/ 文件存储虽然数据库一般用于存储动态数据(例如,由最终用户或API客户端生成),可是存在某些类别的数据( 非结构化数据),这些数据不能由用户改变或者基于文件而不适合数据库存储,例如:
Javascript
,CSS
,字体,音频,视频文件。云服务供应商不是将这些存储在数据库中,而是提供专用服务来存储这些服务,例如AWS Simple Storage Service(S3)
,Azure
,Google Cloud Storage
和阿里云OSS
等。
这样作的好处是云供应商能够安全地存储文件,并能够为其制做冗余副本,以最大限度地下降数据丢失的风险。
Blob 存储用于:
Blob
/文件存储服务容许客户端经过HTTP
端点访问文件。例如,您的Web应用程序的HTML标记能够简单地连接到AWS S3中存储的图像和CSS文件的URL。 传统网络访问:
可是,假设个人用户位于中国,个人S3存储位于美国西部 - 数据传输距离数千英里,所以个人用户会看到延迟。
CDN是什么?使用CDN有什么优点?
使用了CDN的网站访问:
CDN
工做流经过权威DNS服务器来实现最优节点的选择,经过缓存来减小源站的压力。
Caching Service
虽然CDN
是静态文件的一种缓存形式,但Web
应用程序可能须要临时缓存动态数据。
例如,假设存在一个数据库查询,该查询对昨天的数据执行计算,其结果天天常常被成千上万的用户访问。每次用户请求此数据时联系数据库就没有任何意义。
对此的解决方案是使用高速缓存服务在第一个用户请求以后将结果存储一段时间。经过缓存将更快地提供对该数据的后续请求。
缓存服务本质上是一种特殊类型的数据库。 缓存采用键值存储的形式,其中键是应用程序代码用于查询数据的字符串(例如DailySiteStats_2018-10-17),值是缓存的实际数据。缓存的数据一般彻底保存在内存中,这使得从缓存中检索数据的速度很是快。
常见的缓存服务是Redis
和Memcached
。AWS经过其Elasticache
服务提供这二者的托管版本。
Redis
和Memcached
对比Redis
和Memcached
是都是主流的开源内存数据存储。虽然它们既易于使用又提供高性能,但在选择引擎时须要考虑重要的差别。Memcached
是为简单而设计的,而Redis
提供了丰富的功能,使其可以普遍用于各类用例。
Memcached | Redis | |
---|---|---|
亚毫秒级延迟 | 是 | 是 |
开发人员易用性 | 是 | 是 |
数据分区 | 是 | 是 |
多语言支持 | 是 | 是 |
高级数据结构 | - | 是 |
多线程架构 | 是 | - |
快照 | - | 是 |
复制 | - | 是 |
发布/订阅 | - | 是 |
Lua脚本 | - | 是 |
地理空间支持 | - | 是 |
亚毫秒级延迟:
Redis
和Memcached
都支持亚毫秒的响应时间。经过将数据存储在内存中,它们能够比基于磁盘的数据库更快地读取数据。
开发人员易用性:
Redis
和Memcached
在语法上都很容易使用,而且须要最少许的代码才能集成到您的应用程序中。
数据分区:
Redis
和Memcached`都容许您在多个节点之间分发数据。这容许您在需求增加时向外扩展以更好地处理更多数据。
支持普遍的编程语言:
Redis
和Memcached
都有许多面向开发人员的开源客户端。支持的语言包括Java,Python,PHP,C,C ++,C#,JavaScript,Node.js,Ruby,Go
等等。
高级数据结构:
除了字符串,Redis
还支持列表,集合,有序集,哈希,位数组等。应用程序可使用这些更高级的数据结构来支持各类用例。例如,你可使用Redis排序集轻松实现游戏排行榜,该排行榜保持按其排名排序的玩家列表。
多线程架构:
因为Memcached
是多线程的,所以它可使用多个处理核心。这意味着您能够经过扩展计算容量来处理更多操做。
快照:
使用Redis
,您可使用即时快照将数据保存在磁盘上,该快照可用于存档或恢复。
复制:
Redis
容许您建立Redis
主数据库的多个副本。这容许您扩展数据库读取并具备高可用性集群。
发布/订阅:
Redis
支持使用模式匹配的Pub /Sub
消息传递,您能够将其用于高性能聊天室,实时评论流,社交媒体源和服务器互通。
Lua脚本:
Redis
容许您执行事务性Lua
脚本。脚本能够帮助您提升性能并简化应用程序。
地理空间支持:
Redis
具备专门用于大规模处理实时地理空间数据的命令。您能够执行诸如查找两个元素(例如人或地点)之间的距离以及查找点的给定距离内的全部元素之类的操做。
适用于批处理任务和分离应用程序的异步消息收发
有时,你程序须要执行的任务与响应用户请求没有直接关系。
例如,假设用户上传了须要编码和水印的视频。但这是一项长期运行的任务,所以让用户在完成时等待是没有意义的。更好的方法是异步执行此操做。您的网络应用程序代码会在队列中建立一条做业消息,并通知您的用户,当水印视频准备就绪时,他们将收到一封电子邮件(消息)。
而后,你将拥有一个能够执行如下操做的工做任务流:
这里有2个架构组件:
您能够经过如下几种方式实现worker
任务:
CRON
做业以触发应用程序服务器上安装的指定代码,以便按特定计划从队列中读取。FaaS
平台调用工做器代码。消息队列是一种异步的服务间通讯方式,适用于无服务器和微服务架构。消息在被处理和删除以前一直存储在队列上。每条消息仅可被一位用户处理一次。消息队列可被用于分离重量级处理、缓冲或批处理工做以及缓解高峰期工做负载。
如今经常使用的MQ组件有activeMQ
、rabbitMQ
、rocketMQ
、zeroMQ
还有近年来火热的kafka
,从某些场景来讲也是MQ,固然kafka的功能更增强大,虽然不一样的MQ都有本身的特色和优点,可是,无论是哪一种MQ,都有MQ自己自带的一些特色。
特性 | 说明 |
---|---|
推送或拉取传送 | 拉取是指不断查询队列以获取新消息。推送是指系统在有可用消息时通知用户 (也称为发布/订阅消息收发)。您还可使用长轮询让拉取等待指定的时间,以便新消息在完成以前到达。 |
定时或延迟传送 | 支持为消息设置特定的传送时间。若是须要为全部消息设置相同延迟,能够设置一个延迟队列。 |
至少一次传送 | 消息队列能够存储多个消息副本以实现冗余和高可用性,并在发生通讯故障或错误的状况下从新发送消息,以确保它们至少通过一次传送。 |
确切一次传送 | 在不允许重复的状况下,FIFO (先进先出) 消息队列会经过自动筛选重复来确保每一个消息均精确地传输了一次 (且只有一次)。 |
FIFO (先进先出) 队列 | 在这些队列中,首先接受处理的是最先的 (或第一个) 条目,有时称为“队首”。 |
消息优先级 | 一般状况下,您能够为消息分配优先级,以肯定要在队列中添加该消息的位置,从而确保优先级较高的消息位于队列前端并获得优先处理。 |
咱们的实际场景大概是一个基于微服务架构的电商系统,分为用户微服务、商品微服务、订单微服务、促销微服务等。
基于微服务模式开发的系统,MQ的使用场景更多。这里咱们就列举一下常见的应用示例。
注册后咱们可能须要作不少初始化的操做,如:
后台发布商品的时候:
elasticsearch
)MQ
,而后经过监听MQ
来生成elasticsearch
对应的数据。用户下单后,24小时未支付,须要取消订单。
逛国外社区看到这篇,以为挺简洁明了的。
只是以为好玩,就按其大纲,重写总结一下,有说错的地方多担待。
意思就是写得略粗糙,别喷我。。。
若是你以为这篇内容对你挺有启发,我想邀请你帮我三个小忙:
也能够来个人GitHub
博客里拿全部文章的源文件:
前端劝退指南:github.com/roger-hiro/…