tidb 与 tdsql 比较  [draft]

tidb 是优秀的国产开源分布式数据库, 因为其开放和拥抱开源的态度, 我也得以参与其中, 成为社区一员. tidb 到底咋样, 有没有它说的那么厉害, 有啥优缺点, 需要找一个合适的对手来比较. 通过比较也可以取长补短, 互相学习. 因为我用腾讯的产品比较多, 也有同学参与了 tdsql 的开发, 对 tdsql 有少量的了解, 所以找它作为比较对象. 首先申明, 我不是数据库专家, 仅仅是入行不久的爱好者, 也没有深度参与两家数据库的开发工作, 所以仅仅是一个仰望者的视角, 会做尽量多的调研, 但主要基于双方公开资料. 简介 tidb tidb 是 pingcap 公司的产品, 创始人刘奇, 黄东旭, 崔秋 均为技术出身, 有多个流行的开源项目, 这可能为 tidb 打下了开放和开源的基因. tidb 历史 先来说说数据库的发展史. 架构 特性 优缺点 生态 总结 参考 腾讯云TDSQL助力金融核心系统数字化转型 TDSQL inside之路 腾讯云TDSQL高可用技术解决方案介绍 TDSQL怎么实现迁移TDSQL云原生

October 10, 2021 · 1 分钟 · ming

some tips for golang range

There are 2 types of range, with index and without index. Let’s see an example for range with index. func TestRangeWithIndex(t *testing.T) { rows := []struct{ index int }{{index: 0}, {index: 1}, {index: 2}} for _, row := range rows { row.index += 10 } for i, row := range rows { require.Equal(t, i+10, row.index) } } the output is: Error Trace: version_test.go:39 Error: Not equal: expected: 10 actual : 0 Test: TestShowRangeWithIndex Above test fails since when range with index, the loop iterator variable is the same instance of the variable with a clone of iteration target value....

September 17, 2021 · 3 分钟 · ming

golang i18n的不同思路

传统的解决方案 i18n是软件开发中常见的一个需求, 很多流行的开发框架如 ruby on rails, springboot 对它有内置的支持。 rails 的 i18n 是其中的佼佼者, 我们看看它解决了哪些问题,是如何解决的。 i18n 资源文件 通常开发者需要按照框架的约定创建资源文件,一般会在目录或文件名中包含如 es, en 等 locale 信息,方便框架按需加载。 |---books |-----es.yml |-----en.yml |---users |-----es.yml |-----en.yml key 的定义和查找优先级 通常每个翻译文本会对应一个有意义的key,通过 key + locale 的组合得到当前 locale 下的翻译文本. I18n.t 'activerecord.models.user' # => 'Customer' I18n.t 'activerecord.models.user' # => '客户' en: activerecord: models: user: "Customer" attributes: user: login: "Login" zh: activerecord: models: user: "客户" attributes: user: login: "登陆" 当项目到一定规模, key 的数量很多时,key 的命名就显得格外重要,否则重用 key 时很难查找。 而且除了用户自定义的 key, 框架一些内置的 key 如日期, 错误消息等, 也需要用户提供翻译。 所以 key 的命名 rails 也做了约定,如下...

June 30, 2021 · 2 分钟 · ming

博客迁移到 hugo

折腾博客的那些事 2012年开始折腾博客,转眼已经8个年头,一开始用的 jekyll, 期间在简书上面也写了少量文章,再基于 halo 搭建了动态站点 topcoder, 然后最近受 苏洋的博客 启发基于 hugo 搭建了本博客。 hola 是带后端的博客程序, 本意是搞一点动态内容和互动进去, 可是本身的懒惰导致写博客都没有好好坚持, 动态站点一年多也跟一个静态站点差不多,没什么动态内容。 而像 苏洋的博客 这样的静态站点, 内容却挺吸引我, 可见重要的是内容。 选型 go 是一门有活力有前途的语言,我最近也正在学习, 这是我选择 hugo 的一个原因, 另一个原因是 hugo 确实很快, 我现在80多篇文章 300 毫米左右, 估计 10000 篇博客以内, 都在一秒内就够了。 Start building sites … | ZH -------------------+------ Pages | 161 Paginator pages | 17 Non-page files | 0 Static files | 1 Processed images | 0 Aliases | 41 Sitemaps | 1 Cleaned | 0 Built in 362 ms 但它的模板语法写起来还是挺繁琐, 做主题, 做静态站点这块前端有一定成本。...

March 27, 2021 · 1 分钟 · ming

multispeack 简单研究

multispeack 简单研究 MultiSpeak Specification 是一个广泛用于北美企业和公用事业部门(如水电)的企业应用互联规范,帮助它们定义接口, 让不同供应商的软件可以不需额外开发接口就可以互联。 为了达成这个目标, 该规范有3个主要部分组成: 通用数据模型 通用数据模型是对某一业务流程的数据的规范,如停电事件模型。通用数据模型使用 XML 描述。 消息结构 为了交换数据,需要定义消息结构,MultiSpeak 使用 WSDL 来描述消息, 用 web service 来交换消息, 支持实时的,或者批量。 业务流程 不同的 web service 调用组成了单个业务流程中的一个步骤,多个步骤组成了一个业务流程, 多个业务流程组成了一个完整的业务。 一个业务流程 和 一个完整的业务分别在模块用户案例和完整用户案例中描述。 使用情况 超过 90 家企业和公用事业部门贡献和使用该规范, 有超过 360 家经过训练的软件供应商 需要注册会员, 不知道是否收费, 未注册尝试 下载规范文档需要收费, 按模块, 每个模块 300 美金, 页面上共 12 个收费模块, 3个免费模块, 详情 费用情况 未见开源产品, 它有一个官方市场, 有一些产品供购买,包括:...

March 19, 2021 · 2 分钟 · ming

rust 和 go 语言调研

java 的弊端 做软件开发已经 10 多年了,主要是偏业务的 web 应用开发, 主要语言是 java, js(typescript),ruby,shell, sql等, 主要框架为 springboot, jquery, vue, rails 等。 随着微服务和云原生的发展,容器成为新一代的虚拟单元,传统 java 技术栈在这一块的不足越发明显: 镜像大 内存占用高 启动慢,跟语言和框架层面都有关系 运行慢 高并发不容易 分发不方便 这些不足跟 java 的虚拟机,面向对象,反射,垃圾回收等语言特性有关。这些特性并不都是坏处, 但随着外部环境的变化,有些特性变的不适用或者不再有优势。 java 社区也在做一些改进,如 java 的反应式编程框架 vertx, 可直接将 java 代码编译成可执行文件的 GraalVM 虚拟机等,但总归是有不少历史包袱,只能在某一些方面做有限改进。 新兴语言 反观一些新兴语言,在运行速度, 资源占用,分发便利性等方面有全面的优势,比较典型的就是 go 和 rust。 go 在网络领域有惊人的表现, 出现了一大堆优秀框架,如 docker, k8s, traefik, canddy 等。 rust 知名项目少一点,有 deno, tikv,libra,ripgrep 等 其中 tidb 作为 new sql 的代表数据库产品之一获得了巨大的成功,它使用 rust 作为存储引擎开发语言, go 作为解析执行引擎开发语言,是两种语言使用的集大成者。...

February 10, 2021 · 1 分钟 · ming

2021年小公司技术架构选型

企业web应用技术讨论 基于兴趣和职业发展的考虑,我参加了上次关于“增量配网产品”架构的讨论会议,对公司现有的产品,人员,技术储备有了一定的了解。 会上对未来几年公司使用的技术栈有了指导性的意见,但候选项只有项目中已经使用的几个非常成熟的技术,个人认为欠缺广度和深度。 仅有限的几个同事参与,意味着可能公司有人掌握了某项技术,但没有成为一个候选项。 除了手边会用的工具, 也应该到市面上找更合适的工具。 一定的技术预研和储备是非常必要的 故写了这篇文章,抛出我的观察和思考,然后看看“沉默的大多数"中有没有志同道合的人,可以将一些更先进(合适)的技术引入公司业务, 助力公司发展。 由于我们讨论的是企业web应用,所以需要关心的问题大概有下面几类,我们依次讨论。 web, 即前端 一些传统的企业开发不重视前端,觉得能用就行,分工上也没有专门的前端工程师,而是由后端工程师一把梭。 但前端的工作量并不小,开发维护成本很高,且易用性美观度等也大大影响用户对软件的整体印象。 如果有多端显示,小程序等需求,则难度和成本更是直线上升。 传统的 js 和 jquery 应用缺乏模块管理,依赖管理,组件化支持等关键特性, 为了解决这些问题,前端的生态发展很快,工程化和模块化水平已经不输后端,出现了 angular, reactjs, vue, svelet 等优秀的 mvvm 框架, 以及 typescript 这样的强类型编译语言,解决了前端大代码量下的开发效率问题。 对于需要 seo 的应用, 纯静态页面和后台生成页面还有一定市场,但对于企业开发,mvvm是完美的解决方案, 也就意味着前后端的完全分离, 后端只提供数据,展示和交互逻辑完全由前端负责。下面简单介绍一下几个 mvvm 框架的特点。 相同点 组件化 响应式数据绑定 状态和路由管理 不同点 reactjs,facebook 出品,生态丰富,使用 jsx 抽象程度高,学习成本高,大公司使用较多。 vue,华人出品,生态较丰富,使用模板抽象程度较高,学习成本低,中小公司和国内使用较多。 svelet 较新,基于一种新的思路,即将运行时的问题提前到编译器解决,目前在前后端均出现了这样的案例。优势是没有运行时,代码小,性能高,很适合做组件开发。 应用层,即后端 移动互联网的发展催生了很多高并发和大数据量的业务,也造就了云厂商的繁荣和容器技术的发展,devops 和云原生等技术被提出,用于解决后端日益复杂的开发运维问题。以 k8s 的出现为标志,基本解决了云环境下的cpu,内存,网络,存储这些计算资源管理和分配问题,有人说 k8s 是云环境下的操作系统,所以后端的开发不得不考虑基础设施到底是啥的问题。...

February 1, 2021 · 1 分钟 · ming

微服务:难民-单体架构的边界在哪里

下面的文章是微博上某博主探讨微服务架构时的看法,大意是单体架构的边界比想象中宽广的多,和我的有些想法很契合,特转发至此。 Martin Fowler 开的公司是做技术咨询和外包服务的,最热衷这种新名词了 (不搞点新概念怎么开展新业务)。还有现在的云厂商也很乐于推微服务架构,多好的卖机器卖服务的机会啊,一个原本只用单机部署的系统鼓吹一下搞成微服务拆成 N 个系统后又可以多赚几倍的钱了。 我在传统行业做了 10 几年的企业应用,从地市级到省级系统,只要是面向内部用户的,就没有一个是单体系统满足不了的。微服务架构更适合那种用户规模起来之后的互联网企业,从阿里辞职出来之后,过去 8 年,我再也没参与过基于微服务架构的系统了,因为没有真实的需求。 我当初就是在阿里的中间件团队工作,微服务架构的系统所需要的三架马车全在我们组,包括服务框架、分库分表中间件、消息中间件。这三架马车我就参与了其中两架: 服务框架、分库分表中间件。 服务框架当初阿里的叫 HSF,除了最基本的 RPC 功能也有软负载,然后还得有 config server 做服务的注册与发现,搞到后面你还得做一个分布式调用链跟踪系统,为了存储分析调用链中的日志又得引入一整套的大数据领域的技术栈 (当年我们全网每天的调用量是 2000 亿起步)。 现在开源的微服务技术栈可以选用 Apache Dubbo 做 RPC 框架,但是服务注册与发现你还得配合其他的 (比如 Apache Dubbo 官方推荐用 zookeeper)。顺便说个八卦: Apache Dubbo 就是当年在阿里内部跟我们组的 HSF 竞争失败后开源出来的,现在能流行也是无心插柳。自从阿里云这家子公司做成了之后,发现微服务可能是门好生意,Dubbo 这个弃儿居然还有不少用户,然后又把 Dubbo 捡起来了,至于阿里云上面是套 Dubbo 的壳卖 HSF 的企业版还是别的动机我就不多猜了。 除了 Apache Dubbo,现在 java 平台上的微服务技术栈还有比较火的 Spring Cloud 全家桶,我只看过,但没有用过。vert.x 也有微服务的套件,我也没有用到真实的商业系统中。说白了就是没有几个系统需要上微服务。 以上说的还只是解决 API 层面的调用问题,你以为一个采用微服务架构的系统有了 Dubbo 和 Spring Cloud 就够了吗?错错错,session 管理在阿里都需要一个专门的小中间件,为了解决不同系统的消息传递问题,又得引入消息中间件。 还有最难的,数据层的问题怎么搞?你告诉我拆成了 N 个系统后还搞一个共享数据库?逗我玩呢。微服务架构的系统在数据库的层面基本上多是 OLTP 类型的,现在开源成熟的面向 OLTP 的分布式数据库可以说没有,别跟我提国内某司的 NewSQL 数据库,那东西在 OLTP 场景下的性能简直不能看,所以现在还是会用 MySQL 这样的传统关系数据库,然后搭配分库分表中间件来解决微服务架构系统的后端存储问题,拆分后的子系统都有自己的数据库集群。...

November 4, 2020 · 1 分钟 · ming

微服务:雄伟巨石可以成为城堡

DHH 在 2020.04.08 发表了一篇最新博客 “The Majestic Monolith can become The Citadel”,继续讨论对微服务的一点看法,提出了一种与微服务相对的 “城堡” 模式。在推上也引发了不少关注,搜关键字 “The Majestic Monolith” 就能看到很多。这是原文链接:https://m.signalvnoise.com/the-majestic-monolith-can-become-the-citadel/ 我按照个人理解,粗略翻译了一下。大家可以对照原文来看,如有翻译不准确的地方,请在回复中提出来。 大多数的 Web 应用应该都是从一块 “雄伟巨石” 开始其生涯的:一个单一代码库做其所需的所有事儿。与之相对的是一群 Service,不管这些 Service 是 “微” 还是 “大一点” 的,都试图把应用切成孤岛,每个仅做整体工作的一小片而已。 大多数的 Web 应用都将以 “雄伟巨石” 形态在其一生中都能持续提供很好的服务。这种模式的上限很高,比大部分人幻想成为架构师时所能想象的要高得多。 但是,尽管如此,“雄伟巨石” 仍然会有需要一些帮助的那一天。也许你正在与庞大的团队打交道,其中的人们相互磕磕绊绊(即使这样,别忘了有很多非常大的组织依然在使用 monorepo 模式!)。或者你终究会遇到极端负载下的性能或可用性问题,这在 “雄伟巨石” 的技术选择范围内无法轻松解决。你的第一直觉将是改进 “雄伟巨石” 直到其能够应对问题,做了这一切而没成功时,你才会考虑下一步。 下一步就是 “城堡”,保持 “雄伟巨石” 在中心位置,但用一系列的 “基地” 对其支援,每个分离出应用程序职能一个小的子集。“基地” 使得 “雄伟巨石” 得以卸下其不同行为的一个切片,(这些不同行为)要么是出于组织原因,要么是出于性能或实现的原因。 一个在 Basecamp 的这种例子是我们的旧 chat 应用 Campfire。它是在 2005 年构建的,那时 Ajax 和其他 JavaScript 技术都还很新颖,所以它基于 polling 而不是现代 chat app 目前使用的长连接。这意味着每个客户端连接到系统都会每三秒触发一个请求来询问 “是否有我的新消息?”。大多数这些请求都会回答 “不,没有”,但为了获取这个答案,你仍然不得不对请求进行身份验证,查询数据库,等等。...

November 4, 2020 · 1 分钟 · ming

Springboot项目的nginx_https配置研究

近期研究了一下 springboot jsp web 项目的 https 部属,分享一下成果,代码见 https://gitee.com/feitian124/https_demo 准备工作 clone 并打包该项目, 以 war 包方式在 tomcat 中运行,访问 “http://localhost:8080/”, 可以看到网页内容 “welcome, now:14:05:23.489”。 新装 nginx, 访问 “http://localhost/", 可以看到 nginx 的欢迎页面。 80 端口访问项目首页 修改 nginx 如下配置, 可以 http 正常 80 端口访问项目首页了, 但 https 仍然不行。 location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } Nginx 配置 HTTPS Nginx 配置 HTTPS 并不复杂,主要有两个步骤:签署第三方可信任的 SSL 证书 和 配置 HTTPS...

September 24, 2020 · 2 分钟 · ming