目前架构有几个热点方向:微服务, dubbo, Faas,还有 TiDB。

现在开发模式是前后端分离基本成为行规。

应该说以大部分企业业务量级、人员规模来说,要去和淘宝等大厂去对标是非常傻的。对大部分企业来说 LAMP 就够了,要是聪明点把 M 换成 P,那 ElasticSearch 什么的就都省了。

那么这些企业为何要跟风呢? 原因很简单,确实他们有爆发的可能,而一旦爆发后IT建设扛不住压力,就会导致流失的客户再也不回来。人人网曾经有过这样的故事,最近也见过几个这样的案例。可伸缩架构对他们来说的确非常重要。

微服务

微服务架构的优势在哪儿?

我曾经接触过一个死活要搞微服务的公司。他的看法是,项目大了每次部署都要花很久打包,要升级就得重启服务器,所有服务都要停,所以微服务是必须的。

当然,他肯定不知道 d2js 这种扔上去就能完成部署的技术,相似的 php 等等应该也不太了解。

其实微服务这种技术充满了缺点,它把一个产品变成了一堆产品,把内部问题变成了外部问题。上微服务更多的是一个管理需要而不是技术需要。

微服务解决了哪些问题呢?

首先,微服务拆分简单粗暴,在实践中所谓架构师只要若有所思的把传统意义上的功能模块切成微服务就行,一个项目就这样变成了好几个。

这样新招来的十几个人分两个三个组,各自领一个微服务去开发。库也不共用,也不需要共享业务级别的类库。前期成本为零,开发完了靠沟通磨合完成服务对接。

各个项目互为黑匣子,这样每个组想用什么技术用什么技术,各有各的 POM,包冲突什么也不存在了。既然模块功能单一,包名是叫 com.nb.service.payment 好还是叫 com.nb.payment.service 好也不用思考了,毕竟你手里只有 payment。

这个角度微服务的擦屁股版就是所谓中台。

微服务上线后出什么问题也很好查,先找到问题在哪个微服务,揪出相关责任人就行,这样一来其他人就不会被午夜骚扰。

由此可见,微服务其实主要解决的是管理问题,或者说开发模式问题。

微服务的问题有哪些呢?

  1. 一旦采用微服务,许多调用就变成远程调用,成本很高,协调成本也很高。
  2. 微服务对数据库的治理采用一个服务一个库的模式,也导致更高的数据库维护成本,只能便宜云厂商。
  3. 采用微服务后, 程序员越来越沦为 coder, 对产品全局的把握越来越低下
  4. 协调成本很高, 从以往靠代码变为靠文档. 收到接口首先要验收一遍.
  5. 必须上笨重复杂的分布式架构,系统复杂性度大幅上升

dubbo、SpringCloud 等

由于微服务拆分把任何小系统都变成了若干个分布式系统的邦联, 导致以往只有跨系统边界才有的分布式事务等等成为必需品, 分布式架构, TCC, Raft 等等成为显学.

为此就需要引入一些能实现 TCC 的模块, 这就是 dubbo, SpringCloud 等。

这些技术给我带来的感觉特别重,我的预感是会像 EJB 一样过时,让人很难深入进去。

FaaS Servless

函数即服务,和 d2js 的理念很相似。FaaS 彻底把作为业务的主体(业务函数)和作为容器的主体(单节点或分布式系统)彻底切割了。

平台归平台,业务归业务。这是 d2js 设计一个主要初衷。

FaaS 的事件/函数模式和 d2js 也很像,可以说 d2js 往前走一步就是 FaaS。在实践中我也用 crontab 调 URL 的方式实现定时触发 d2js 任务函数,也用 activiti 调用 URL 来触发 d2js 流程处理函数。

相信未来应该属于 FaaS。d2js 应当迅速演进到 FaaS。

FaaS 能不能覆盖所有业务场景呢?无部署的模式不适合一些重量级的算法复杂演算繁多的应用。

Q. 能不能把这种应用的接口视为 F,程序主体视为依赖包呢?
A. 这么理解是不合适的,这些所谓的依赖包需要追随 F 部署,不具备稳定性,不能视为一种东西。并且这些包对环境依赖较高,有的需要 GPU,有的需要自己的 db, 有的需要文件存储,不像 F 可以轻易的迁移。所以像这些服务还是用微服务来实现会比较好。当然,一旦它们能中立的定型下来,转为`F + 依赖包`也未尝不可。

目前的 FaaS 主要问题有:

  1. 函数粒度太小,一个函数即使加上一些 annotation,能表达的东西也是很少的。由于部署不在一处,这种函数和其它函数之间不能简单的互相引用。这和 C# 只有闭包而缺乏匿名内部类的问题相似,单个函数无法形成 bundle,无法形成一组接口这样的概念,组之间需要共享一部分组内数据。
  2. 分布式事务缺失。我看不到容器对分布式事务有任何支持, 因为编写 F 都不需要给相应实现.

TiDB

TiDB 是我通过 LSTM Tree + RDBMS 找到的。PG 也有一个实现,叫 VidarDB. TiDB的应用在国内已经非常广泛了, VidarDB有待检验。

可以说,TiDB 彻底解决了分布式数据库的问题。分布式架构最终形成分布式平台,而不是人人都研究分布式,这才是正道。

如将 LAMP 模型里的 M 换成 TiDB,是不是可以解决今天的问题呢?

A 现在是 NGINX

M 现在是 TiDB

P 现在是 d2js

LNTD 这样的组合,要应付大并发,还需要做这样的改进:

  1. d 所依赖的容器应更换成 vertx 或其它高性能框架,这样 RPS 可以做到极高
  2. 其次,这种容器最好是分布式的容器,这样 d 就不用担心伸缩性
  3. 同样需要 cache 降低数据库压力,需要 MQ 用于削峰。

当然,配合分布式容器,d2js 也应改进 TCC 特性,以及更加专门 FaaS 事件驱动绑定。

有了这些改进,d2js 会是一个非常好用的 FaaS 实现方案。

架构发展趋势以及 d2js 的未来的更多相关文章

  1. WOT干货大放送:大数据架构发展趋势及探索实践分享

      WOT大数据处理技术分会场,PingCAP CTO黄东旭.易观智库CTO郭炜.Mob开发者服务平台技术副总监林荣波.宜信技术研发中心高级架构师王东及商助科技(99Click)顾问总监郑泉五位讲师, ...

  2. 大数据时代的新BI系统架构发展趋势

    商业智能(BI,Business Intelligence).它是一套完整的解决方式,用来将企业中现有的数据进行有效的整合,高速准确的提供报表并提出决策根据.帮助企业做出明智的业务经营决策.     ...

  3. InfoQ一波文章:菜鸟核心技术/Intel发布CPU新架构3D堆栈法/BDL/PaddlePaddle/百度第三代Spider/Tera

    菜鸟智慧新物流核心技术全解析   孟靖 阅读数:63192018 年 12 月 14 日 16:00   2018 年天猫双 11 全球狂欢节已正式落下帷幕,最终成交额定格在 2135 亿元,物流订单 ...

  4. .net 大型分布式电子商务架构说明

    .net大型分布式电子商务架构说明 背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便 ...

  5. Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!)

    Web信息架构——设计大型网站(第3版)(久负盛名经典再现,信息架构设计领域基石之作!) [美]]Peter Morville(彼得·莫维尔)  Louis Rosenfeld(路易斯·罗森菲尔德) ...

  6. E8.Net 工作流二次开发架构平台

    一.          产品简介 E8.Net工作流开发架构是基于微软.Net技术架构的工作流中间件产品,是国内商业流程管理(BPM)领域在.Net平台上的领先产品,是快速搭建流程管理解决方案的二次开 ...

  7. NoSQL架构实践

    经常有朋友遇到困惑,看到NoSQL的介绍,觉得很好,但是却不知道如何正式用到自己的项目中.很大的原因就是思维固定在MySQL中了,他们问得最多的问题就是用了NoSQL,我如何做关系查询.那么接下来,我 ...

  8. net大型分布式电子商务架构

    net大型分布式电子商务架构 背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维 ...

  9. .net大型分布式电子商务架构说明(转载来自<头条>)

    背景 构建具备高可用,高扩展性,高性能,能承载高并发,大流量的分布式电子商务平台,支持用户,订单,采购,物流,配送,财务等多个项目的协作,便于后续运营报表,分析,便于运维及监控. 架构演变 基础框架剥 ...

  10. 云存储的未来:Scale Up还是Scale Out?

      云存储的几十年发展历程,其计算架构模型,也从Scale Up走向Scale Out.但是展望未来数字世界的海量需求,目前流行的模型还能够持续满足吗?本文通过对云存储历史的回顾,及对Scale Up ...

随机推荐

  1. Java中浮点数运算存在的精度问题以及解决方法

    观察以下一段代码,相信小朋友都可以一眼看出答案,但是计算机给出的答案是这样吗? public class TestDouble { public static void main(String arg ...

  2. 使用 Debugger 断点 如果打开了断点调试 就会跳转空白页面

    <!DOCTYPE html> <html> <header> <title>test</title> </header> &l ...

  3. 基于Jenkins + Argo 实现多集群的持续交付

    作者:周靖峰,青云科技容器顾问,云原生爱好者,目前专注于 DevOps,云原生领域技术涉及 Kubernetes.KubeSphere.Argo. 前文概述 前面我们已经掌握了如何通过 Jenkins ...

  4. 云原生爱好者周刊:Dapr 成为 CNCF 孵化项目

    云原生一周动态要闻: Dapr 加入 CNCF 孵化器 Knative 1.0 发布 Canonical 开始提供针对 Intel CPU 优化的 Ubuntu 图像 Longhorn 为 CNCF ...

  5. 服务器开启FTP

    服务器开启 FTP 操作系统:Windows 服务器镜像:Windows Server 2022 数据中心版(简体中文)64 位 一.新建用户以及文件夹 步骤 1:新建用户 打开计算机管理. 打开&q ...

  6. AI For Everyone_Week_1 By Andrew NG 课程英文

    AI For Everyone__Week__1 By Andrew NG 1 Introduction Welcome to AI for everyone. AI is changing the ...

  7. typescript 编译报错 不能用于索引类型

    Element implicitly has an 'any' type because expression of type 'any' can't be used to index type 't ...

  8. Maven 项目获取 git 分支、提交等信息

    git-commit-id-plugin 是一个 Maven 插件,用于在 Maven 项目的构建过程中自动获取 git 仓库的信息,如最后一次提交的 ID.分支名称.构建时间等,并将这些信息注入到项 ...

  9. C++中的各种锁

    在多线程开发中,经常会遇到数据同步,很多情况下用锁都是一个很好的选择.C++中常用的锁主要有下面几种: 互斥锁(std::mutex) 这是最基本的一种锁.它用于保护共享资源,在任意时刻,最多只有一个 ...

  10. delphi Image32 SVG图形查看器

    DELPHI 中没有SVG显示组件,需要用到第三方组件,高版本可以使用skia(但必须带上skia.dll). 最新版Image32修改了很多,SVGIconImageList 也因此换成了Image ...