- 博客(29)
- 收藏
- 关注
转载 高德Serverless平台建设及实践
背景原因是高德当年启动了一个客户端上云项目,项目主要目的是为了提升客户端的开发迭代效率。以前客户端业务逻辑都在端上,产品需求的变更需要走客户端发版才能发布,而客户端发版需要走各种测试流程,灰度流程,解客户端崩溃等问题。客户端上云之后,某些易变的业务逻辑放到云上来。新的产品需求通过在云端来开发,不用走月度的版本发布,加快了需求的开发迭代效率,离产研同频的理想目标又近了一步(为什么要说“又”,是因为高德之前也做了一些优化往产研同频的方向努力,但是我们希望云端一体化开发能是其中最有效的一个技术助力)。...
2021-06-10 20:57:08
84
转载 ZNBase 和列存引擎
ZNBase 是由浪潮于近期开源的一款 HTAP 分布式数据库,也是首个即将被开放原子开源基金会接纳的国产数据库项目。该数据库系统为应对日益剧增的混合负载场景研发,能够混合事务和分析场景,适用更多数据应用需求。为实现 HTAP 的特性,该数据库系统中的列存引擎子系统在整个系统架构中扮演了重要的角色。优品拍拍支撑 ZNBase 的 HTAP 功能的是多模存储引擎,在其中结构化数据的处理上,存储可以分成行存和列存,是分别针对 OLTP 和 OLAP 场景的优化,而支撑 OLAP 场景的就是的列存引擎。..
2021-06-10 20:55:10
132
转载 OLTP 与 OLAP
从上个世纪 60 年代开始,计算机系统就被人们用于执行薪资结算、会计和计费等领域的任务。那时,用户输入数据,计算机系统再对数据进行处理,从而完成一系列的增删改查操作,这就是早期的 OLTP 。随着计算机技术与数据库技术的进一步发展,OLTP 在政府、银行和企业信息系统中被广泛应用至今。如今,OLTP 被认为是一种低延迟、高容量、高并发工作负载,通常用于开展业务,例如接订单和履行订单,进行装运,为客户开账单,收款等事务处理。而 OLAP 被认为是分析工作负载。OLAP 面对的场景是相对较高的延迟,较低的.
2021-06-10 20:52:55
134
转载 保护可变状态避免重复工作
在 Android 运行时中,包含线程安全的数据结构可供您保护可变变量。比如,在计数器示例中,您可以使用AtomicInteger。又比如,要保护上述代码中的 Map,您可以使用ConcurrentHashMap。ConcurrentHashMap是线程安全的,并且优化了 map 的读取和写入操作的吞吐量。请注意,线程安全的数据结构并不能解决调用顺序问题,它们只是确保内存数据的访问是原子操作。当逻辑不太复杂的时候,它们可以避免使用 lock。比如,它们无法用在上面的 transactionCach...
2021-06-10 20:51:31
65
转载 保护可变状态
对于如何保护可变状态,或者找到合适的同步策略,取决于数据本身和相关的操作。本节内容启发大家注意可能会遇到的并发问题,而不是简单罗列保护可变状态的方法和 API。总而言之,这里为大家准备了一些提示和 API 可以帮助大家针对可变变量实现线程安全。封装可变状态应该属于并被封装在类里。该类应该将状态的访问操作集中起来,根据应用场景使用同步策略保护变量的访问和修改操作。线程限制一种方案是将读取和写入操作限制在一个线程里。可以使用队列基于生产者-消费者模式实现对可变状态的访问。Jetbrains ..
2021-06-10 20:50:10
40
转载 协程中的并发问题
协程由于其能够简单地在不同线程上规划操作,的确使得异步编程更加轻松。但是另一方面,便捷是一把双刃剑:由于协程是运行在 Java 编程语言的线程模型之上,它们难以逃脱线程模型所带来的并发问题。因此,您需要注意并且尽量避免该问题。优品拍拍 近年来,像不可变性这样的策略相对减轻了由线程所引发的问题。然而,有些场景下,不可变性策略也无法完全避免问题的出现。所有并发问题的源头都是状态管理!尤其是在一个多线程环境下访问可变的状态。在多线程应用中,操作的执行顺序是不可预测的。与编译器优化操作执行顺序不同,线...
2021-06-10 20:48:35
269
转载 线程和 withContext 的性能表现
在 Android 运行时中,如果运行的线程比 CPU 的可用内核数多,那么切换线程会带来一定的运行时开销。上下文切换并不轻松!操作系统需要保存和恢复执行的上下文,而且 CPU 除了执行实际的应用功能之外,还需要花时间规划线程。除此之外,当线程中所运行代码阻塞的时候也会造成上下文切换。如果上述的问题是针对线程的,那么在不同的 Dispatchers 中使用 withContext 会带来哪些性能上的损失呢?还好线程池会帮我们解决这些复杂的操作,它会尝试尽量多地执行任务 (这也是为什么在线程池中执行操作.
2021-06-10 20:47:12
217
转载 分发器和线程池
您可以使用Executor.asCoroutineDispatcher()扩展函数将协程转换为CoroutineDispatcher后,即可在应用中的任何线程池中执行该协程。此外,您还可以使用协程库默认的Dispatchers。您可以看到createDefaultDispatcher方法中是如何初始化Dispatchers.Default的。默认情况下,系统会使用DefaultScheduler。如果您看一下Dispatcher.IO的实现代码,它也使用了DefaultSche...
2021-06-10 20:45:53
80
转载 协程和线程
协程旨在简化异步执行的代码。对于 Android 运行时的协程,lambda 表达式的代码块会在专门的线程中执行。例如,示例中的斐波那契运算:// 在后台线程中运算第十级斐波那契数someScope.launch(Dispatchers.Default) { val fibonacci10 = synchronousFibonacci(10) saveFibonacciInMemory(10, fibonacci10)}private fun synchronousFibo..
2021-06-10 20:44:36
41
转载 读写分离水太深,你把握不住,让CQRS来
多年以前,那时我正年轻,做技术如鱼得水,甚至一度希望自己能当一辈子的一线程序员。 但是我又有两个小愿望想要达成:一个是想多挣点钱;另一个就是对项目的技术栈和架构选型能多有点主动权。 多挣点钱是因为当时我刚结婚不久,有自己的家庭规划,所以挣钱的欲望也蛮强。 而想有多点技术主动权的原因则是当时领导很赏识我,有些东西逐渐的放权让我做,我尝到了甜头,所以,也有了自己的一些小野心。 而正巧就在那时候,领导给我了一个现在看来职业生涯中还挺重要的机会。 当时,广告联盟正是发展的如
2021-06-10 20:41:19
61
转载 我的学习方法是每天看 10 个 NPM 模块?
第一次看到的时候感觉有点鸡汤,但静下心来仔细想想却不无道理,以 Vite 来举例子,我在看它代码的时候,印象很深的一个点就是各种开源模块信手拈来,恰到好处的解决了需求,这种能力是一定需要大量的开源模块阅读量的。Vite magic-string比如 Vite 中大量运用magic-string这个库做一些字符串的魔术替换,这个库的目的就是在一些轻量级替换源代码的场景中替代 AST 这种过于庞大的解决方案。var MagicString = require('magic-string')v..
2021-06-07 16:47:22
253
转载 CPU特权级别
Intel CPU拥有四个特权级别,由r0到r3,由寄存器中的两个隐藏位(bit)指定:00为r0,01为r1,10为r2,11为r3。权限大小:r0>r1>r2>r3,每种特权级别所能执行的CPU指令都不同,r0能执行所有指令,其它三个能执行的指令依次递减。Windows使用r0作为内核态特权级别,使用r3作为用户态特权级别,其它CPU和系统具体情况不了解,应该大同小异。系统CPU时间运行内核代码所消耗掉的CPU时间,或者说在内核...
2021-06-07 16:44:49
1221
转载 内核封装 的概念
所谓内核就是操作系统的核心,这一点想必大家都知道,然而实际上内核所包含的知识远不止于此,本文中我们主要涉及到的是内核封装的概念。 大家不妨用类的封装来类比——将核心数据保护起来,使不属于内核的代码(或者专业一点儿叫内核空间之外的代码)无法直接访问,只能通过内核提供的接口调用内核代码间接访问——这就叫做内核封装。内核态运行内核代码的状态,或者说运行在内核空间的状态,叫做内核态。 某CPU核心正在运行内核代码,我们就可以说它正处于内核态; 如某进程运行...
2021-06-07 16:41:37
164
转载 代理在后模式
前面的示例都是先执行代理捕获器中的业务逻辑,最后再通过Reflect执行目标对象的属性操作,这种捕获代码操作在前,目标对象操作在后的模式称为“代理在先”模式,有在先,当然就有在后模式。当然这里的“代理在后”模式并不是先使用Reflect对象触发目标对象属性操作,在执行捕获器中的其他操作代码。而是指代理作为目标对象的一种补充,我们仍然操作的是目标对象,只是当某些操作在目标对象上无法实现时,才使用代理对象。等会,当某些操作目标对象无法提供时,js会向目标对象的原型prototype上进行查找,所以“代理
2021-06-07 16:39:16
63
转载 LevelDB 的用法
leveldb 是一个允许修改的数据库,因此其对于 LSM 的使用和 clickhouse 类似,主要的不同在于写入日志后的操作不同。clickhouse 在记录日志后,会直接在内存中进行排序,从而写入磁盘。此时如果 clickhouse 又接到一条写入情况,会重新开启一个新的进程。而 leveldb 在记录日志后,会将数据首先缓存在内存中,等待后续操作继续操作这块内存,直到这块内存被填满,才会一次性将数据写入磁盘。这个差异主要时两个数据库面向的场景不同,clickhouse 主要面向读多写少的
2021-06-07 16:37:12
670
转载 Clickhouse 系列 - 番外 - LSM 算法
LSM 算法最早出现在 1991 年的 ACM 期刊上,之后其思想在各大大数据存储系统中被广泛使用,例如 LevelDB,HBase,Cassandra……LSM 算法由于适应的场景不同,存在很多的变体,clickhouse 也使用 lsm 算来实现其预排序的功能,本文将着重介绍 clickhouse 中的使用,同时也会适当涉及一些其他系统的使用用以让读者体会架构设计的随心所欲。我们都知道,用户在调用 insert 向 clickhouse 插入数据时,数据不一定是按已经按照排序键排序好的数据,大概率是
2021-06-07 16:34:40
360
转载 教你用Python玩转Redis
Redis简介Redis是一个key-value存储系统(数据库)。redis支持存储的value类型有很多种,如string(字符串)、list(链表)、set(集合)、zset(有序集合)和hash(哈希类型)。为了保证效率,数据都是缓存在内存中。可以周期性的把更新的数据写入磁盘或者把修改操作写入追加文件。Redis提供了Python,Ruby,Java,Php的客户端,使用很方便,本文主要以Python来讲解Redis的操作。1.安装redis库通过下面命令进行安装pip ins
2021-06-07 16:31:05
65
转载 Service worker 的概念和用法
Service worker 是一个注册在指定源和路径下的事件驱动worker。它采用 JavaScript 控制关联的页面或者网站,拦截并修改访问和资源请求,细粒度地缓存资源。你可以完全控制应用在特定情形(最常见的情形是网络不可用)下的表现。Service worker 运行在worker上下文,因此它不能访问 DOM。相对于驱动应用的主 JavaScript 线程,它运行在其他线程中,所以不会造成阻塞。它设计为完全异步,同步API(如XHR和localStorage)不能在 service ...
2021-06-07 16:25:13
418
转载 自学Go语言过程中摸索出的底层知识
概念约定本文中出现的概念只是为了方便描述而假设的概念,有些概念在专业术语中并不存在; 并且所有概念在不同硬件、操作系统及编程语言下的实际表现可能会有细节上的不同。进程时间进程直接从CPU核心分配CPU时间,某进程分配到的CPU时间又称为它的进程时间。优品拍拍线程时间线程从它所属的进程的进程时间中分配时间,某线程分配到的CPU时间又称为它的线程时间。协程时间协程从它所属的线程的线程时间中分配时间,某协程分配到的CPU时间又称为它的...
2021-06-07 16:22:45
74
转载 PostgreSQL如何对某行记录进行模糊查询
在某些场景下,我们可能需要对表的某行字段进行查询。 例如BI报表的下拉框,用户可能会勾选多个条件进行查询,那么我们查询会很麻烦。 例如: bill@bill=>create table test1(c1 int,c2 text,c3 text,c4 text); CREATE TABLE bill@bill=>insert into test1 values(1,'post','china','bill'); INSERT 0 1 如果我们要查询该表
2021-06-05 10:06:54
132
转载 Kubernetes资源清单篇:如何创建资源?
资源清单,等同于一个剧本,能够告诉我们每一步应该怎么去做,Kubernetes接收到这么一个剧本,就能够按照这个剧本去执行,以达到我们的预期。 在Kubernetes中,一般都是通过定义资源清单的方式去创建资源。一般使用yaml格式的文件来创建符合我们预期期望的资源,这样的yaml文件我们称为资源清单。(也可以定义为json格式) 如,创建一个Pod资源: apiVersion: v1 kind: Pod metadata: name: vue-fronten
2021-06-05 10:04:18
63
转载 漫谈图形引擎中的材质系统
图形引擎通常需要支持不同的渲染效果,一个优秀的材质系统通常要支持多Pass渲染管线和自定义Shader模板,由于渲染效果的复杂多样性会导致Shader数量大幅增加,这样会造成Shader文件冗余,因此材质系统要提供一套Shader复用的机制。同时,市面上各硬件厂商对图形API的支持程度不同,受限于硬件水平的差异,材质系统也要兼容中低高端硬件。综上所述,通用材质系统需要满足以下需求:优品pa'p 多Technique:材质中包含多个实现方案,这样在进行高中低端机适配或实现不同材质效果时,我们
2021-06-05 10:02:20
59
转载 js的Proxy代理对象?看完你就会了!
通过捕捉器,我们就可以捕获到 代码中对属性的操作时机,让我们能够先执行我们自定义的业务逻辑代码。因为我们对目标对象的属性操作改为了对代理对象相同的属性操作,所以我们在最后需要通过Reflact执行目标对象的原始操作。 var consume = 0 // 目标对象 var obj = {wallet: 100} // 捕获器trap var handlers = { set(target, key, val) { // target 目标对象 //
2021-06-05 10:00:18
427
转载 应该在JavaScript中使用Class吗?
OOP 即 面向对象编程 (Object Oriented Programming)毫无疑问是软件设计和发展中的一大进步。事实上,一些编程语言如 Java 、C++ 就是基于 OOP 的核心概念 class 开发出来。 在高校的 CS 相关专业中,无论教授什么编程语言,OOP的学习是绝对不会被落下的。 同时,OOP在业界中也的确被大量使用,尤其是的后端服务领域、桌面软件、移动APP开发等。 因此,OOP看起来在软件行业无处不在,在这种有点教条主义的氛围下,很多程序员甚至以为 c
2021-06-05 09:58:18
111
转载 js的Proxy代理对象?看完你就会了!
每次我们修改钱包剩余金额时,都要执行一次consume++去执行一次记账的操作。有没有更简单的方式,不需要每次都写上一行代码去增加消费次数呢?答案当然有,它就是Proxy代理对象!使用代理对象,你想对目标对象的属性操作全部改为对代理对象相同属性的操作,代理对象提供了对属性获取 [[get]] 修改 [[set]] 等操作的拦截,js将这种拦截称为trap(捕捉器)。j'you'pin通过捕捉器,我们就可以捕获到 代码中对属性的操作时机,让我们能够先执行我们自定义的业务逻辑代码。因为我们对目标对象的属
2021-06-04 22:38:56
353
转载 Facebook 宣布将 PyTorch 作为默认 AI 框架
该公司表示,通过将其所有 AI 系统迁移到 PyTorch,他们将能够更快地进行创新,同时确保为其所有用户提供更佳的体验。根据透露,Facebook 的迁移工作已经推进了有一年多的时间,并且其已经将大部分的 AI 工具迁移到了 PyTorch。 目前,已有超过 1700 个基于 PyTorch 的推理模型在 Facebook 中达到了生产级别要求;其用于识别和分析 Facebook 上内容的 93% 的新 AI 训练模型也是基于 PyTorch 的。此外,在 Faceboo...
2021-06-04 22:36:48
74
转载 Chrome 改进 Enhanced Safe Browsing 功能,强化扩展程序和文件下载安全性
Google 在 Chrome 浏览器中为 Enhanced Safe Browsing(增强型安全浏览)增加了新的保护功能,如今在安装不受信任的扩展程序时将向用户发出警告,并允许用户要求对下载文件进行更深入的扫描。Safe Browsing功能自 2007 年起就内置于 Chrome 浏览器中,当访问恶意网站(例如,试图窃取用户凭证、下载有害文件)时,它会根据存储在 Chrome 浏览器中的不安全网站列表来检查 URL,对这类危险事件发出警告。Enhanced Safe Browsing则..
2021-06-04 22:34:46
362
转载 深入解析 Raft 模块在 ZNBase 中的优化改造
深入解析 Raft 模块在 ZNBase 中的优化改造 Raft 作为一种管理日志复制的分布式一致性算法,由斯坦福大学的 Diego Ongaro 和 John Ousterhout 在论文中提出。在 Raft 出现之前,Paxos 一直是分布式一致性算法的标准。但 Paxos 相对难以理解,Raft 的设计目标就是简化 Paxos,使得一致性算法更容易理解和实现。 Paxos 和 Raft 都是分布式一致性算法,其过程如同投票选举领袖(Leader),参选者(Candidate)需要说服大
2021-06-04 22:33:19
76
转载 Tapdata 数据库实时同步的技术要点
在数据库同步场景下,Tapdata 支持批量及增量的数据迁移及同步。Tapdata 主打的是实时场景,所以在数据库增量同步上是一个关键能力。目前 Tapdata 支持的数据源,基本上都支持增量同步。大部分场景下 Tapdata 通过解析数据库日志的方式来获得源端数据库的增删改操作,然后将这些操作转化为标准的数据库事件,推送到内部处理队列。 数据同步流程 那么,Tapdata 是怎么样来做数据同步的呢? 第一层的数据同步是基于CDC机制,也就是说它并不是用一个 Select .
2021-06-04 22:30:23
224
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人