当前位置: 首页 > news >正文

JuiceFS 在火山引擎边缘计算的应用实践

火山引擎边缘云是以云计算基础技术和边缘异构算力结合网络为基础,构建在边缘大规模基础设施之上的云计算服务,形成以边缘位置的计算、网络、存储、安全、智能为核心能力的新一代分布式云计算解决方案。

边缘存储主要面向适配边缘计算的典型业务场景,如边缘渲染。火山引擎边缘渲染依托底层海量算力资源,可助力用户实现百万渲染帧队列轻松编排、渲染任务就近调度、多任务多节点并行渲染,极大提升渲染效率。

边缘场景存储挑战

这里简单介绍一下在边缘渲染中遇到的存储问题:

  • 需要对象存储与文件系统的元数据统一,实现数据通过对象存储接口上传以后,可以通过 POSIX 接口直接进行操作;

  • 满足高吞吐量的场景需求,尤其是在读的时候;

  • 完全实现 S3 接口和 POSIX 接口。

为了解决在边缘渲染中遇到的存储问题,团队花了将近半年的时间开展了存储选型测试。最初,团队选择了公司内部的存储组件,从可持续性和性能上来说,都能比较好的满足我们的需求。

但是落地到边缘场景,有两个具体的问题:

  • 首先,公司内部组件是为了中心机房设计的,对于物理机资源和数量是有要求的,边缘某些机房很难满足;

  • 其次,整个公司的存储组件都打包在一起,包括:对象存储、块存储、分布式存储、文件存储等,而边缘侧主要需要文件存储和对象存储,需要进行裁剪和改造,上线稳定也需要一个过程。

团队讨论后,形成了一个可行的方案:CephFS + MinIO 网关。MinIO 提供对象存储服务,最终的结果写入 CephFS,渲染引擎挂载 CephFS,进行渲染操作。测试验证过程中,文件到千万级时,CephFS 的性能开始下降,偶尔会卡顿,业务方反馈不符合需求。

同样的,基于 Ceph 还有一个方案,就是使用 Ceph RGW + S3FS。这个方案基本能满足要求,但是写入和修改文件的性能不符合场景要求。

经过三个多月的测试之后,我们明确了边缘渲染中对于存储的几个核心诉求:

  • 运维不能太复杂:存储的研发人员能够通过运维文档上手操作;后期扩容以及处理线上故障的运维工作需要足够简单。

  • 数据可靠性:因为是直接给用户提供存储服务,因此对于写入成功的数据不允许丢失,或者出现跟写入的数据不一致的情况。

  • 使用一套元数据,同时支持对象存储和文件存储:这样业务方在使用的时候,不需要多次上传和下载文件,降低业务方的使用复杂度。

  • 针对读有比较好的性能:团队需要解决的是读多写少的场景,因此希望有比较好的读性能。

  • 社区活跃度:在解决现有问题以及积极推进新功能的迭代时,一个活跃的社区能有更快的响应。

明确核心诉求之后,我们发现前期的三个方案都不太满足需求。

初识 JuiceFS

火山引擎边缘存储团队在 2021 年 9 月了解到了 JuiceFS,并跟 Juicedata 团队进行了一些交流。经过交流我们决定在边缘云场景尝试一下。JuiceFS 的官方文档非常丰富,可读性很高,通过看文档就可以了解比较多的细节。

于是,我们就开始在测试环境做 PoC 测试,主要关注的点是可行性验证,运维和部署的复杂度,以及跟上游业务的适配,是否符合上游业务的需求。

我们部署了 2 套环境,一个环境是基于单节点的 Redis + Ceph 搭建,另一个环境是基于单实例的 MySQL + Ceph 搭建

在整个环境搭建方面因为 Redis、MySQL 和 Ceph(通过 Rook 部署)都比较成熟,部署运维方案可以参考的资料也比较全面,同时 JuiceFS 客户端也能够简单和方便地对接这些数据库和 Ceph,因此整体的部署流程非常流畅。

业务适配方面,边缘云是基于云原生开发和部署的,JuiceFS 支持 S3 API,同时完全兼容 POSIX 协议,还支持 CSI 的方式挂载,完全满足我们的业务需求。

综合测试后,我们发现 JuiceFS 完全契合业务方的需求,可以在生产上进行部署运行,满足业务方的线上需求。

使用 JuiceFS 的收益

业务流程优化

在使用 JuiceFS 之前,边缘渲染主要利用字节跳动内部的对象存储服务(TOS),用户上传数据到 TOS 中,渲染引擎再从 TOS 上将用户上传的文件下载到本地,渲染引擎读取本地的文件,生成渲染结果,再将渲染结果上传回 TOS,最后用户从 TOS 中下载渲染结果。整体的交互流程有好几个环节,而且中间涉及到比较多的网络以及数据拷贝,所以在这个过程中会存在网络抖动或者时延偏高的情况,影响用户体验。

使用 JuiceFS 后的简化流程

使用 JuiceFS 之后,流程变成了用户通过 JuiceFS S3 网关进行上传,由于 JuiceFS 实现了对象存储和文件系统的元数据的统一,可以直接将 JuiceFS 挂载到渲染引擎中,渲染引擎以 POSIX 接口对文件进行读写,最终用户直接从 JuiceFS S3 网关中下载渲染结果,整体的流程更加简洁和高效,同时也更稳定。

读文件加速,大文件顺序写加速

得益于 JuiceFS 的客户端缓存机制,我们可以将频繁读取的文件缓存到渲染引擎本地,极大加速了文件的读取速度。我们针对是否打开缓存做了对比测试,发现使用缓存后可以提升大约 3-5 倍的吞吐量

同样,因为 JuiceFS 的写模型是先写内存,当一个 chunk(默认 64M)被写满,或者应用调用强制写入接口(close 和 fsync 接口)时,才会将数据上传到对象存储,数据上传成功后,再更新元数据引擎。所以,在写入大文件时,都是先写内存,再落盘,可以大大提升大文件的写入速度。

目前边缘的使用场景主要以渲染类为主,文件系统读多写少,文件写入也是以大文件为主。这些业务场景的需求和 JuiceFS 的适用场景非常吻合,业务方在存储替换为 JuiceFS 后,整体评价也很高。

在边缘存储中如何使用 JuiceFS

JuiceFS 主要是在 Kubernetes 上部署,每个节点都有一个 DaemonSet 容器负责挂载 JuiceFS 文件系统,然后以 HostPath 的方式挂载到渲染引擎的 pod 中。如果挂载点出现故障,DaemonSet 会负责自动恢复挂载点。

在权限控制上,边缘存储是通过 LDAP 服务来认证 JuiceFS 集群节点的身份,JuiceFS 集群的每个节点都通过 LDAP 的客户端与 LDAP 服务进行验证。

我们目前应用的场景主要还是以渲染为主,后期会扩展到更多业务场景。在数据访问上,边缘存储目前主要通过 HostPath 的方式进行访问,后期如果涉及到弹性扩容的需求,会考虑使用 JuiceFS CSI Driver 来部署。

JuiceFS 存储生产环境实践经验

元数据引擎

JuiceFS 支持了非常多的元数据引擎(如 MySQL、Redis),火山引擎边缘存储生产环境采用的是 MySQL。我们在评估了数据量与文件数的规模(文件数在千万级,大概几千万,读多写少场景),以及写入与读取性能以后,发现 MySQL 在运维、数据可靠性,以及事务方面都做得比较好。

MySQL 目前采用的是单实例和多实例(一主二从)两种部署方案,针对边缘不同的场景灵活选择。在资源偏少的环境,可以采用单实例的方式来进行部署,MySQL 的吞吐在给定的范围之内还是比较稳定的。这两种部署方案都使用高性能云盘(由 Ceph 集群提供)作为 MySQL 的数据盘,即使是单实例部署,也能保证 MySQL 的数据不会丢失。

在资源比较丰富的场景,可以采用多实例的方式来进行部署。多实例的主从同步通过 MySQL Operator 提供的 orchestrator 组件实现,两个从实例全部同步成功才认为是 OK 的,但是也设置了超时时间,如果超时时间到了还没有同步完成,则会返回成功,并打出报警。待后期的容灾方案健全后,可能会采用本地盘作为 MySQL 的数据盘,进一步提升读写性能,降低时延以及提升吞吐。

MySQL 单实例配置

容器资源:

  • CPU:8C

  • 内存:24G

  • 磁盘:100G(基于 Ceph RBD,在存储千万级文件的场景下元数据大约占用 30G 磁盘空间)

  • 容器镜像:mysql:5.7

  • MySQL 的 my.cnf 配置:

ignore-db-dir=lost+found  # 如果使用 MySQL 8.0 及以上版本,需要删除这个配置
max-connections=4000
innodb-buffer-pool-size=12884901888  # 12G

对象存储

对象存储采用自建的 Ceph 集群,Ceph 集群通过 Rook 部署,目前生产环境用的是 Octopus 版本。借助 Rook,可以以云原生的方式运维 Ceph 集群,通过 Kubernetes 管控 Ceph 组件,极大降低了 Ceph 集群的部署和管理复杂度。

Ceph 服务器硬件配置:

  • 128 核 CPU

  • 512GB 内存

  • 系统盘:2T * 1 NVMe SSD

  • 数据盘:8T * 8 NVMe SSD

Ceph 服务器软件配置:

  • 操作系统:Debian 9

  • 内核:修改 /proc/sys/kernel/pid_max

  • Ceph 版本:Octopus

  • Ceph 存储后端:BlueStore

  • Ceph 副本数:3

  • 关闭 Placement Group 的自动调整功能

边缘渲染主打的就是低时延高性能,所以在服务器的硬件选择方面,我们给集群配的都是 NVMe 的 SSD 盘。其它配置主要是基于火山引擎维护的版本,操作系统我们选择的是 Debian 9。数据冗余上为 Ceph 配置了三副本,在边缘计算的环境中可能因为资源的原因,用 EC 反而会不稳定。

JuiceFS 客户端

JuiceFS 客户端支持直接对接 Ceph RADOS(性能比对接 Ceph RGW 更好),但这个功能在官方提供的二进制中默认没有开启,因此需要重新编译 JuiceFS 客户端。编译之前需要先安装 librados,建议 librados 的版本要跟 Ceph 的版本对应,Debian 9 没有自带与 Ceph Octopus(v15.2.*)版本匹配的 librados-dev 包,因此需要自己下载安装包。

安装好 librados-dev 之后,就可以开始编译 JuiceFS 客户端。我们这边使用了 Go 1.19 来编译,1.19 中新增了控制内存分配最大值https://go.dev/doc/gc-guide#Memory_limit)这个特性,可以防止极端情况下 JuiceFS 客户端占用过多内存而出现 OOM。

make juicefs.ceph

复制代码

编译完 JuiceFS 客户端即可创建文件系统,并在计算节点挂载 JuiceFS 文件系统了,详细步骤可以参考 JuiceFS 官方文档。

未来和展望

JuiceFS 是一款云原生领域的分布式存储系统产品,提供了 CSI Driver 组件能够非常好的支持云原生的部署方式,在运维部署方面为用户提供了非常灵活的选择,用户既可以选择云上,也可以选择私有化部署,在存储扩容和运维方面较为简单。完全兼容 POSIX 标准,以及跟 S3 使用同一套元数据的方式,可以非常方便地进行上传、处理、下载的操作流程。由于其后端存储是对象存储的特点,在随机小文件读写方面有较高的延迟,IOPS 也比较低,但在只读场景,结合客户端的多级缓存,以及大文件场景,还有读多写少的场景,JuiceFS 有比较大的优势,非常契合边缘渲染场景的业务需求

火山引擎边缘云团队未来与 JuiceFS 相关的规划如下:

  • 更加云原生:目前是以 HostPath 的方式来使用 JuiceFS,后面我们考虑到一些弹性伸缩的场景,可能会切换到以 CSI Driver 的方式来使用 JuiceFS;

  • 元数据引擎升级:抽象一个元数据引擎的 gRPC 服务,在其中提供基于多级缓存能力,更好地适配读多写少的场景。底层的元数据存储,可能会考虑迁移到 TiKV 上,以支持更多的文件数量,相对于 MySQL 能够更好地通过横向扩展来增加元数据引擎的性能;

  • 新功能及 bug 修复:针对当前业务场景,会增加一些功能以及修复一些 bug,并期望为社区贡献 PR,回馈社区。

关于作者

何兰州火山引擎边缘计算高级开发工程师,负责边缘存储的技术选型,演进和稳定性;研究领域主要有分布式存储和分布式缓存;云原生开源社区爱好者。

相关文章:

JuiceFS 在火山引擎边缘计算的应用实践

火山引擎边缘云是以云计算基础技术和边缘异构算力结合网络为基础,构建在边缘大规模基础设施之上的云计算服务,形成以边缘位置的计算、网络、存储、安全、智能为核心能力的新一代分布式云计算解决方案。边缘存储主要面向适配边缘计算的典型业务场景&#…...

实验06 二叉树遍历及应用2022

A. 【程序填空】二叉树三种遍历题目描述给定一颗二叉树的特定先序遍历结果,空树用字符‘0’表示,例如AB0C00D00表示如下图请完成以下程序填空,建立该二叉树的二叉链式存储结构,并输出该二叉树的先序遍历、中序遍历和后序遍历结果输…...

基于蜣螂算法改进的LSTM分类算法-附代码

基于蜣螂算法改进的LSTM分类算法 文章目录基于蜣螂算法改进的LSTM分类算法1.数据集2.LSTM模型3.基于蜣螂算法优化的RF4.测试结果5.Matlab代码摘要:为了提高LSTM数据的分类预测准确率,对LSTM中的参数利用蜣螂搜索算法进行优化。1.数据集 数据的来源是 UC…...

如何正确应用GNU GPLv3 和 LGPLv3 协议

文章目录前言GNU GPLv3.0Permissions(许可)Conditions(条件)Limitations(限制)GNU LGPLv3.0应用GPLv3.0应用LGPLv3.0建议的内容:添加文件头声明附录GNU GPLv3.0原文GNU LGPLv3.0 原文前言 对于了解开源的朋友们,GNU GPL系列协议可谓是老朋友了。原来我基…...

Python局部函数及用法(包含nonlocal关键字)

Python 函数内部可以定义变量,这样就产生了局部变量,可能有人会问,Python 函数内部能定义函数吗?答案是肯定的。Python 支持在函数内部定义函数,此类函数又称为局部函数。 那么,局部函数有哪些特征&#x…...

关于BMS的介绍及应用领域

电池管理系统(Battery Management System,BMS)是一种集成电路系统,它用于监测和控制电池系统状态,以确保电池的正常运行和安全使用。BMS的应用涵盖了电动汽车、储能系统、无人机、电动工具等各个领域,可以提…...

2月datawhale组队学习:大数据

文章目录一、大数据概述二、 Hadoop2.1 Hadoop概述2.2 su:Authentication failure2.3 使用sudo命令报错xxx is not in the sudoers file. This incident will be reported.2.4 创建用户datawhale,安装java8:2.5 安装单机版Hadoop2.5.1 安装Hadoop2.5.2 修…...

在Spring框架中创建Bean实例的几种方法

我们希望Spring框架帮忙管理Bean实例&#xff0c;以便得到框架所带来的种种功能&#xff0c;例如依赖注入等。将一个类纳入Spring容器管理的方式有几种&#xff0c;它们可以解决在不同场景下创建实例的需求。 XML配置文件声明 <?xml version"1.0" encoding"…...

PyQt5 界面预览工具

简介 一款为了预览PyQt5设计的UI界面而开发的工具&#xff0c;使用时需要结合PyCharm同时使用。 下载 PyQt5界面预览工具 参数说明 使用配置 启动PyCharm&#xff0c;找到File -> Settings&#xff0c;打开 找到Tools -> External Tools点击打开&#xff0c;在新界面…...

day44【代码随想录】动态规划之零钱兑换II、组合总和 Ⅳ、零钱兑换

文章目录前言一、零钱兑换II&#xff08;力扣518&#xff09;二、组合总和 Ⅳ&#xff08;力扣377&#xff09;三、零钱兑换&#xff08;力扣322&#xff09;总结前言 1、零钱兑换II 2、组合总和 Ⅳ 3、零钱兑换 一、零钱兑换II&#xff08;力扣518&#xff09; 给你一个整数…...

计算机网络第1章(概述)学习笔记

❤ 作者主页&#xff1a;欢迎来到我的技术博客&#x1f60e; ❀ 个人介绍&#xff1a;大家好&#xff0c;本人热衷于Java后端开发&#xff0c;欢迎来交流学习哦&#xff01;(&#xffe3;▽&#xffe3;)~* &#x1f34a; 如果文章对您有帮助&#xff0c;记得关注、点赞、收藏、…...

GPT-3(Language Models are Few-shot Learners)简介

GPT-3(Language Models are Few-shot Learners) 一、GPT-2 1. 网络架构&#xff1a; GPT系列的网络架构是Transformer的Decoder&#xff0c;有关Transformer的Decoder的内容可以看我之前的文章。 简单来说&#xff0c;就是利用Masked multi-head attention来提取文本信息&a…...

容器安全风险and容器逃逸漏洞实践

本文博客地址&#xff1a;https://security.blog.csdn.net/article/details/128966455 一、Docker存在的安全风险 1.1、Docker镜像存在的风险 不安全的第三方组件&#xff1a;用户自己的代码依赖若干开源组件&#xff0c;这些开源组件本身又有着复杂的依赖树&#xff0c;甚至…...

2023年美赛B题-重新想象马赛马拉

背景 肯尼亚的野生动物保护区最初主要是为了保护野生动物和其他自然资源资源。肯尼亚议会于2013年通过了《野生动物保护和管理法》提供更公平的资源共享&#xff0c;并允许替代的、以社区为基础的管理工作[1]。此后&#xff0c;肯尼亚增加了修正案&#xff0c;以解决立法中的空…...

Docker常用命令总结

目录 一、帮助启动类命令 &#xff08;1&#xff09;启动docker &#xff08;2&#xff09;停止docker &#xff08;3&#xff09;重启docker &#xff08;4&#xff09;查看docker &#xff08;5&#xff09;设置开机自启 &#xff08;6&#xff09;查看docker概要信息…...

mac环境,安装NMP遇到的问题

一 背景 项目开发中,公司项目需要使用本地的环境运行,主要是php这块的业务。没有使用docker来处理,重新手动撸了一遍。记录下其中遇到的问题; 二 遇到的问题 2.1 Nginx的问题 brew install nginx后,启动nginx,报错如下:nginx: [emerg] no "ssl_certificate" …...

Web Worker 与 SharedWorker 的介绍和使用

目录一、Web Worker1 Web Worker 是什么2 Web Worker 使用3 简单示例二、SharedWorker2.1 SharedWorker 是什么2.2 SharedWorker 的使用方式2.3 多页面数据共享的例子一、Web Worker 1 Web Worker 是什么 Web Worker是 HTML5 标准的一部分&#xff0c;这一规范定义了一套 API…...

React:Redux和Flux

React,用来构建用户界面,它有三个特点: 作为view,构建上用户界面虚拟DOM,目的就是高性能DOM渲染【diff算法】、组件化、多端同构单向数据流,是一种自上而下的渲染方式。Flux 在一个React应用中,UI部分是由无数个组件嵌套构成的,组件和组件之间就存在层级关系,也就是父…...

TypeScript 学习之Class

基本使用 class Greeter {// 属性greeting: string;// 构造函数constructor(message: string) {// 用this 访问类的属性this.greeting message;}// 方法greet() {return Hello, this.greeting;} } // 实例化 let greeter new Greeter(World);声明了一个Greeter类&#xff…...

doris - 数仓 拉链表 按天全量打宽表性能优化

数仓 拉链表 按天全量打宽性能优化现状描述优化现状描述 1、业务历史数据可以变更 2、拉链表按天打宽 3、拉链表模型分区字段设计不合理&#xff0c;通用的过滤字段没有作为分区分桶字段 4、拉链表表数据量略大、模型数据分区不合理和服务器资源限制&#xff0c;计算任务执行超…...

服务器虚拟化及优势

服务器虚拟化是从一台物理服务器创建多个服务器实例的过程。每个服务器实例代表一个隔离的虚拟环境。在每个虚拟环境中&#xff0c;都可以运行单独的操作系统。 1.更有效的资源调配 使用虚拟化技术大大节省了所占用的空间&#xff0c;减少了数据中心里服务器和相关硬件的数量。…...

华为ensp模拟校园网/企业网实例(同城灾备及异地备份中心保证网络安全)

文章简介&#xff1a;本文用华为ensp对企业网络进行了规划和模拟&#xff0c;也同样适用于校园、医院等场景。如有需要可联系作者&#xff0c;可以根据定制化需求做修改。作者简介&#xff1a;网络工程师&#xff0c;希望能认识更多的小伙伴一起交流&#xff0c;私信必回。一、…...

git命令篇(持续更新中)

首先介绍这个网页&#xff1a;https://learngitbranching.js.org/?localezh_CN --提交命令 git commit --创建分支 git branch <分支名> --切换分支 git checkout <分支名> --合并分支 (合并到主分支去&#xff0c;把我合并到谁的身上去) 自己写的分支合并到主线…...

用记事本实现“HelloWorld”输出

一、在任意文件夹中创建一个新的文本文档文件并写入以下代码 public class Hello{public static void main (String[] args){System.out.print("Hello,World!");} } 二、修改文件名称及文件类型为 Hello.java 特别注意&#xff1a;文件命名必须与代码中类的名称相同…...

Python基础1

1. 注释 单行注释&#xff1a;以#开头。一般建议注释和内容用空格隔开。 多行注释&#xff1a;以一对三个双引号括起来的内容是注释。“““示例注释”””。 2. 数据类型 验证数据类型的方法&#xff1a;type&#xff08;被查看类型的数据&#xff09;。 注意&#xff1a;…...

4.2 双点双向路由重发布

1. 实验目的 熟悉双点双向路由重发布的应用场景掌握双点双向路由重发布的配置方法2. 实验拓扑 双点双向路由重发布如图4-6所示: 图4-6:双点双向路由重发布 3. 实验步骤 IP地址的配置R1的配置 <Huawei>system-v…...

AcWing《蓝桥杯集训·每日一题》—— 3768 字符串删减

AcWing《蓝桥杯集训每日一题》—— 3768. 字符串删减 文章目录AcWing《蓝桥杯集训每日一题》—— 3768. 字符串删减一、题目二、解题思路三、代码实现本次博客我是通过Notion软件写的&#xff0c;转md文件可能不太美观&#xff0c;大家可以去我的博客中查看&#xff1a;北天的 …...

第五天笔记

1. 简述图片验证码使用流程&#xff1f; 1.前段生成UUID随机值&#xff0c;作为GET请求参数 2.后端试图进行判断&#xff0c;调用工具类来生成图片验证码和内容 3.将验证码内容使用redis保存到本地,前端传入的uuid作为key, 4.在前段输入获取到的图片验证码&#xff0c;想后端发…...

如何使用ArcGIS进行地理配准

1.概述 对于GIS数据而言&#xff0c;坐标信息是灵魂&#xff0c;有了坐标信息之后才能和别的数据结合使用&#xff0c;之前有介绍过矢量数据定义坐标信息的方法&#xff0c;针对栅格图&#xff0c;这里为大家介绍一下通过地理配准增加坐标信息的方法&#xff0c;希望能对你有所…...

【java基础知识】

Java中的基本数据类型是什么&#xff1f; byte&#xff1a;1字节&#xff0c;有符号&#xff0c;表示整数&#xff0c;范围为-128到127。short&#xff1a;2字节&#xff0c;有符号&#xff0c;表示整数&#xff0c;范围为-32768到32767。int&#xff1a;4字节&#xff0c;有符…...

建设网站公司谁家好/百度推广助手官方下载

说明 页面加载文档完毕后&#xff0c;浏览器会通过 Javascript 为 DOM 元素添加事件。 Javascript 使用 window.onload 方法&#xff0c;而 jQuery 使用 $(document).ready() 方法。 $(document).ready() 方法可以极大的提高 Web 应用程序的相应速度&#xff0c;因为该方法可以…...

关于自行建设门户网站的请示/网络营销的工具有哪些

D:\百度地图\百度地图\资料\百度地图与定位SDK\百度地图v3.5.0\BaiduMap_AndroidSDK_v3.5.0_All\BaiduMap_AndroidSDK_v3.5.0_Docs\doc\index.html public final class MapView extends ViewGroup ViewGroup是一个ViewGroup,是一个容器,学自定义View的时候我们就知道如果是一个…...

做视频网站每部电影都要版权/百度怎么提交收录

GroupBy是个Collector&#xff0c;它是用来进行Stream上的collect操作的。Collect是一个Mutable Reduction。所谓reduction&#xff0c;相当于把集合里的每一个元素依次带入一个函数&#xff0c;最终得到一个值。比如求一组int的和&#xff0c;可以用reduction写作。int sum n…...

成都专业网站营销/各平台推广费用

2019独角兽企业重金招聘Python工程师标准>>> 看一下sails的特性 http://www.sailsjs.org/#!/features安装 npm install -g sails很简单就可以安装了。 看一下它的帮助 sails --helpUsage: sails [command]Commands:version lift [options] new…...

运城网站建设公司有多少/搜索引擎营销案例分析题

Python是一种面向对象的解释型计算机程序设计语言&#xff0c;由荷兰人Guido van Rossum于1989年发明&#xff0c;第一个公开发行版发行于1991年。Python的特点&#xff1a;优雅、明确、简单。Python适合的领域&#xff1a;Web网站和各种网络服务、系统工具和脚本、作为“胶水”…...

如何自己做网站及优化/视频号推广

原文地址为&#xff1a; CDN技术详解及实现原理CDN技术详解 一本好的入门书是带你进入陌生领域的明灯&#xff0c;《CDN技术详解》绝对是带你进入CDN行业的那盏最亮的明灯。因此&#xff0c;虽然只是纯粹的重点抄录&#xff0c;我也要把《CDN技术详解》的精华放上网。公诸同好。…...