go任务调度12(实现master)
项目结构:crontab(项目名) /master /worker /commongo语言本身是多线程的,开发的时候用的是协程,协程会被调度到线程上,线程是操作系统概念,要发挥golang的多核优势,就让它的线程数量和cpu数量相等。注意strconv.Itoa()和string()的区别,和可能产生的错...阅读全文
项目结构:crontab(项目名) /master /worker /commongo语言本身是多线程的,开发的时候用的是协程,协程会被调度到线程上,线程是操作系统概念,要发挥golang的多核优势,就让它的线程数量和cpu数量相等。注意strconv.Itoa()和string()的区别,和可能产生的错...阅读全文
源自 Plan9 汇编实现。 保存在 .s 文件中,编译器自动编译、链接。本文内容基于 amd64 架构。指令指令参数长度。MOVB: 1-byte MOVW: 2 MOVL: 4 MOVQ: 8 数据移动方向:从左往右。 ADD R1, R2 // R2 += R1 SUB R3, R4 // R4 -= R3 SUB R3, R4, R5 // R5 = R4 - R3 MUL $7, R6 // R6 *= 7 内存访问。 MOV (R1), R2 // R2 = *R1 MOV 8(R1), R2 // R2 = *(8 + R2) MOV 16(R1)(R2*2), R3 // R3 = *(16 + R1 + R2*2) MOV runtime·x(SB), R2 // R2 =...阅读全文
go的GC机制 GO的GC是并行GC,也就是说GC的大部分清理和普通的go代码是同时运行的,这让GO的GC流程比较复杂。 标记清除(Mark And Sweep) 此算法主要有两个主要的步骤: 标记(Mark phase) = 清除(Sweep phase) 第一步,找出不可达的对象,然后做上标记。 第二步,回收标记好的对象。 操作非常简单,但是有一点需要额外注意:mark and sweep算法在执行的时候,需要程序暂停,即stop the world。 三色标记法 对于Mark And Sweep来说要通过STW保证GC期间标记对象的状态不能变化,整个程序都要暂停掉,在外部看来程序就会卡顿。 当前Golang使用的垃圾回收机制是三色标记发配合写屏障和辅助GC,三色标记法是标记-清除法的一...阅读全文
Go语言开发分布式任务调度 轻松搞定高性能CrontabGolang因其强大的协程机制,现已广泛应用于解决分布式环境下的高并发问题。本门课程中将结合Etcd与MongoDB实现一个基于Master-Worker分布式架构的任务调度系统。你不仅将掌握Golang的工程实践能力,而且会收获诸如CAP、Raft的分布式经典理论与架构经验,”工程能力”与”知识体系”齐头并进,实现华丽质变第1章 课程介绍本章中将介绍一下本课程的基本内容,包括:我们要做什么、要求什么基础、将学会哪些工具、收获哪些独家干货,以及课程具体安排。1-1 课程导学 试看第2章 如何执行shell命令执行"定时任务"其实就是执行"shell命令"。在本章中,将首先带大家区分"程序"与"命令",接着了解bash命令解释器的2种工作...阅读全文
需要导出的sql 表 image.png 代码 需要用到 "github.com/360EntSecGroup-Skylar/excelize" 请自行下载 此代码只限制 A到Z列,只限于一个sheet,数据量太大 建议修改 func SQL2XLSX(autoField []string,fileName string){ f:= excelize.NewFile() //写入自定义字段 for i:=0;i
写在前面 开发 hashset 常用的套路: map[int]int8 map[int]bool 我们一般只用 map 的键来保存数据,值是没有用的。所以来缓存集合数据会造成内存浪费。 空对象 空对象是个神奇的东西。它指的是没有字段的结构类型。 type Q struct{} 它牛逼的地方在于: 可以和普通结构一样操作 var a = []struct{}{struct{}{}} fmt.Println(len(a)) // prints 1 不占用空间 var s struct{} fmt.Println(unsafe.Sizeof(s)) // prints 0 声明两个空对象,它们指向同一个地址 type A struct{} a := A{} b := A{} fmt.Println...阅读全文
四种拼接方案:
1,直接用 += 操作符, 直接将多个字符串拼接. 最直观的方法, 不过当数据量非常大时用这种拼接访求是非常低效的。
2,直接用 + 操作符,这个和+=其实一个意思了。
3,用字符串切片([]string)装载所有要拼接的字符串,最后使用strings.Join() 函数一次性将所有字符串拼接起来。在数据量非常大时,这种方法的效率也还可以的。
4,利用Buffer( Buffer是一个实现了读写方法的可变大小的字节缓冲 ),将所有的字符串都写入到一个Buffer缓冲区中,最后再统一输出,这种方法最快。
代码示例
...阅读全文
连接etcd: package main import ( "fmt" "go.etcd.io/etcd/clientv3" "time" ) var ( config clientv3.Config client *clientv3.Client err error ) func main() { //客户端配置 config = clientv3.Config{ Endpoints: []string{"0.0.0.0:2379"}, //集群列表 DialTimeout: 5 * time.Second, } //建立连接 if client, err = clientv3.New(config); err != nil { fmt.Println(err) return } clie...阅读全文
用网上别人写的Get 函数 ``` func Get(url string) (content string, statusCode int) { resp, err1 := http.Get(url) if err1 != nil { statusCode = -100 return } defer resp.Body.Close() data, err2 := ioutil.ReadAll(resp.Body) if err2 != nil { statusCode = -200 return } statusCode = resp.StatusCode content = string(data) return } ...阅读全文
#### uintptr 和 unsafe普及 ##### uintptr 在Go的源码中uintptr的定义如下: ```go /* uintptr is an integer type that is large enough to hold the bit pattern of any pointer. 从英文注释可以看出 uintptr是一个整形,它的大小能够容纳任何指针的位模式,它是无符号的,最大值为:18446744073709551615,怎么来的,int64最大值 * 2 +1 */ type uintptr uintptr ``` **位模式**:内存由字节组成.每个字节由8位bit组成,每个bit状态只能是0或1.所谓位模式,就是变量所占用内存的所有bit的状态的序列 *...阅读全文
1.WaitGroup的用途 WaitGroup的用途:它能够一直等到所有的goroutine执行完成,并且阻塞主线程的执行,直到所有的goroutine执行完成。 官方对它的说明如下: A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all gorou...阅读全文
文章来源:http://gf.johng.cn/625833 基本介绍 平滑重启(热重启)是指Web Server在重启的时候不会中断已有请求的执行。该特性在不同的项目版本发布的时候特别有用,例如,当需要先后发布两个版本:A、B,那么在A执行的过程当中,我们可以将B的程序直接发布覆盖A的程序,并使用平滑重启特性无缝地将请求过渡到新版本的服务中。 需要注意的是,该特性仅限于*nix系统(Linux/Unix/FreeBSD等等),在Windows下仅支持完整重启功能(请求无法平滑过渡)。 管理功能 gf框架支持非常方便的Web管理功能,也就是说我们可以通过Web页面/接口直接进行Web Server的重启/关闭等管理操作。同时,gf框架也支持通过命令行终端指令(仅限*nix系统)的形式进行We...阅读全文
天气:晴 任务清单 调试yaml文件 go 实例 Errors ,Goroutines, Channels 习惯养成类:日更800+字 && writingTime >=1h 习惯养成类:单词 30个,复习优先,你的目的是为了记住单词,而不是看到更多的单词。同理,记住单词也不是目的,而是使用英文阅读理解,沟通交流的手段。所以每个单词至少要熟悉一个例句。 周目标·完成进度 golang 1K 众病之王---癌症治疗的认知升级(总结2000字+) 梁宁的产品思维30讲(写总结2000字+) 学有所得 健康·饮食·锻炼 每天8000步,今天: 食物中低热量,底油,低盐的比重大于50%的重量:早上OK 人际·家人·朋友 至少每天1小时的陪伴 联系一个老朋友 工作·思考 最美好的三件事 早上没看天气,...阅读全文
1、并发并不是并行,前者是优先对时间片的抢占,后者是真多核。 go中多线程时直接要求并行的方法是: runtime.GOMAXPROCS(runtime.NumCPU()) 亦不可滥用,CPU密集型,并发度很高的场景适用。 2、go起的协程 3、 function that returns a chanel fan-in 二次缓冲 send a chanel on a chanel 利用chanel饥饿阻塞原理实现有序 select 利用select的ok随机执行性,可以少起一些Goroutine select+time.After 可以做些限时事物 select+chanel 利用chanel的饥饿原理,把它当做了信号量来用,这个信号量还可以有具体含义,比如错误信息 $(function ...阅读全文
下载,解压,进入目录,运行: [root@bogon etcd-v3.3.12-linux-amd64]# ./etcd --listen-client-urls 'http://0.0.0.0:2379' --advertise-client-urls 'http://0.0.0.0:2379'(本地etcd的端口) etcd控制工具: [root@bogon etcd-v3.3.12-linux-amd64]# ETCDCTL_API=3 ./etcdctl (前面需要一个环境变量ETCDCTL_API=3)put、get、del、--prefix: [root@bogon etcd-v3.3.12-linux-amd64]# ETCDCTL_API=3 ./etcdctl put "n...阅读全文
前言 在上一篇文章《Golang实现简单爬虫框架(4)——队列实现并发任务调度》中,我们使用用队列实现了任务调度,接下来首先对两种并发方式做一个同构,使代码统一。然后添加数据存储模块。 注意:本次并发是在上一篇文章简单并发实现的基础上修改,所以没有贴出全部代码,只是贴出部分修改部分,要查看完整项目代码,可以查看上篇文章,或者从github下载项目源代码查看 1、项目重构 (1)并发引擎 通过分析我们发现,两种不同调度的区别是每个worker一个channel还是 所有worker共用一个channel,所以我们在接口中定义一个函数WorkerChan(),用来决定这件事,即worker一个channel还是 所有worker共用一个channel。此时ConfigMasterWorkerCh...阅读全文
Go 语言的并发编程风格 Go 有两种并发编程风格: goroutine 和通道(chennle),支持通信顺序进程(Communicating Sequential Process, CSP),CSP 是一个并发的模式,在不同的执行体(goroutine)之间传递值,但是变量本身局限于单一的执行体。 共享内存多线程的传统模型,这和在其他主流语言中使用的线程类似。 这章讲第一种 goroutine 和通道。 通道 如果说 goroutine 是 Go 程序并发的执行体,通道就是它们之间的连接。每一个通道是一个具体类型的导管,叫作通道的元素类型。 像 map 一样,通道是一个使用 make 创建的数据结构的应用。当复制或者作为参数传递到一个函数时,复制的是引用,这样调用者和被调用者都引用了同一...阅读全文
pow介绍 工作量证明(PoW,Proof of Work...阅读全文
前言 在上一篇文章《Golang实现简单爬虫框架(3)——简单并发版》中我们实现了一个最简单并发爬虫,调度器为每一个Request创建一个goroutine,每个goroutine往Worker队列中分发任务,发完就结束。所有的Worker都在抢一个channel中的任务。但是这样做还是有些许不足之处,比如控制力弱:所有的Worker在抢同一个channel中的任务,我们没有办法控制给哪一个worker任务。 其实我们可以自己做一个任务分发的机制,我们来决定分发给哪一个Worker 注意:本次并发是在上一篇文章简单并发实现的基础上修改,所以没有贴出全部代码,只是贴出部分修改部分,要查看完整项目代码,可以查看上篇文章,或者从github下载项目源代码查看 1、项目架构 在上一篇文章实现简单并发...阅读全文
输入输出(比较慢,针对较小的数据量) 输入: 4 abcd 处理代码: var ( n int s []byte // or string ) fmt.Scan(&n) fmt.Scan(&s) or fmt.Scanf("%d\n", &n) // 如果不加 '\n',再次读入 s时,会读入失败(cf) fmt.Scanf("%s\n", &s) 3. 输入输出 (针对大量数据) func (inputReader *InputReader) init() { inputReader.buf, _ = ioutil.ReadAll(os.Stdin) inputReader.size = len(inputReader.buf) } func (inputReader *InputRead...阅读全文
姓名:张志文 学号:19021210649 链接:https://www.jianshu.com/p/80bde972196d [嵌牛导读] 计算机中的线程,进程和协程之间存在着许多的联系和区别 [嵌牛鼻子] 线程;进程;协程 [嵌牛提问] 什么是线程、进程和协程? 进程 我们都知道计算机的核心是CPU,它承担了所有的计算任务;而操作系统是计算机的管理者,它负责任务的调度、资源的分配和管理,统领整个计算机硬件;应用程序则是具有某种功能的程序,程序是运行于操作系统之上的。 进程是一个具有一定独立功能的程序在一个数据集上的一次动态执行的过程,是操作系统进行资源分配和调度的一个独立单位,是应用程序运行的载体。进程是一种抽象的概念,从来没有统一的标准定义。 进程一般由程序、数据集合和进程控制块三部分...阅读全文
一致性哈希算法 CARP 原理解析, 附 Golang 实现 在后端服务开发的过程中, 遇到了这样一个问题: 需要在 mysql 前面部署 redis 做一层缓存, 要求 redis 是集群部署, 并且每台 redis 节点只缓存总数据量的 1/N, N 为 redis 的个数. 看到这里大家都能想到到一个方法是使用 hash(key)%N 来选取 redis 进行 value 的存取, 这种方式当然可以很均匀的将数据分配到 N 个 redis 服务上, 并且实现起来也非常的简单. 但是使用这种哈希取余的方式有一个很大的问题, 那就是当 redis 集群扩容或者缩容, 或者发生宕机的时候, 也就是上述公式中的 N 发生变化的时候, 这个时候 hash(key)%N 的值保持不变的概率非常小,...阅读全文
Go For It,是我们开源工具系列中的第十个工具,它将使你在 2019 年更高效,它在 Todo.txt 系统的基础上构建,以帮助你完成更多工作。每年年初似乎都有疯狂的冲动想提高工作效率。新年的决心,渴望开启新的一年,当然,“抛弃旧的,拥抱新的”的态度促成了这一切。通常这时的建议严重偏向闭源和专有软件,但事实上并不用这样。 这是我挑选出的 19 个新的(或者对你而言新的)开源工具中的第 10 个工具来帮助你在 2019 年更有效率。 Go For It有时,人们要高效率需要的不是一个花哨的看板或一组笔记,而是一个简单、直接的待办事项清单。像“将项目添加到列表中,在完成后检查”一样基本的东西。为此,纯文本 Todo.txt 系统可能是最容易使用的系统之一,几乎所有系统都支持它。 Go Fo...阅读全文
Golang的数据声明格式如下 data := [7]int{} data:=[3]int{1, 2, 3} data := [...]int{1, 2, 3} 我们注意到,与其他语言不同的是数组的大小放在前面。 Go 语言的数组当做参数时,是值传递,即会copy数组中的所有数据。 所以在实际的go语言开发中其实很少使用数组,而是使用slice. 所以下面我们重点介绍一下slice data := []int{} data := []int{1,2, 3} slice的声明和array类似,只是省略了大小或者'...' 当slice的空间不足时,它就会自动将存储空间增加一倍。 可以用len(data)获取slice中数据的长度,用cap(data)获取slice的容量(capacity). ...阅读全文
天气:小雨 任务清单 后端框架代码 过认证方案。 习惯养成类:日更800+字 && writingTime >=1h 100% 习惯养成类:单词 30个,复习优先,你的目的是为了记住单词,而不是看到更多的单词。同理,记住单词也不是目的,而是使用英文阅读理解,沟通交流的手段。所以每个单词至少要熟悉一个例句。--100% 周目标·完成进度 golang 1K 众病之王---癌症治疗的认知升级(总结2000字+) 学有所得 健康·饮食·锻炼 每天8000步,今天:7000 食物中低热量,底油,低盐的比重大于50%的重量:早上,中午,晚上OK 人际·家人·朋友 至少每天1小时的陪伴 工作·思考 现在和将来的工作中,最重要的事情是什么? 现在和将来的工作中,最重要的基础核心能力是什么? 最美好的三件事...阅读全文
摘要:8月24日,阿里云数据库技术峰会到来,本次技术峰会邀请到了阿里集团和阿里云数据库老司机们,为大家分享了一线数据库实践经验和技术干货。阿里云高级数据库技术专家队皓庭分享了高度兼容MySQL,并且能免去传统数仓ETL过程实现数据分析,同时支持高并发、大吞吐量的在线事务处理的PB级数据存储数据库是如何实现的,帮助大家了解了同时支持海量数据在线事务(OLTP)和在线分析(OLAP)的HTAP关系型数据库是如何打造出来的。 本文将介绍HybridDB for MySQL的定位和现状,以及其技术演进路线和尚待解决的问题。 一、产品现状 ecd041e5a2f378b663f65e9ea906e58e2fb04852 HybridDB for MySQL在RDS MySQL的基...阅读全文
断点续传原理 每次拷贝时,使用seek记录偏移量,并将其记录在本地文件中,下次拷贝时读取时从记录的偏移量的位置继续进行 上次上传代码有错误,已修复 代码实现 核心方法 func ContinueCopy(srcFile, destDir string) (int, error) { // 1. 定义源文件 fileSrc, err := os.Open(srcFile) if err != nil { return 0, err } log.Printf("源文件名称:%s\n", fileSrc.Name()) // 2. 定义目标文件位置,不存在时自动创建 destFile := destDir + srcFile[strings.LastIndex(srcFile, "/")+1:] ...阅读全文
Go 高级并发 原文地址:https://encore.dev/blog/advanced-go-concurrency 原文作者:André Eriksson 译文出处:https://encore.dev/blog 本文永久链接:https://github.com/gocn/translator/blob/master/2020/w1_advanced_go_concurrency.md 译者:咔叽咔叽 校对者:fivezh 如果你曾经使用过 Go 一段时间,那么你可能了解一些 Go 中的并发原语: go 关键字用来生成 goroutines channel 用于 goroutines 之间通信 context 用于传播取消 sync 和 sync/atomic 包用于低级别的原语,例...阅读全文
距离双十一不到5天时间,各种优惠攻略和安利种草想必也看得眼花缭乱。今年双十一不如购点不一样的,提前入手未来黑科技——HEXA可编程全地形机器人。**双十一期间,HEXA工程机限量来袭!**  **活动时间:2017年11月7日——11月11日** **购买链接:[Vincross官网](http://https://www.vincross.com/)** 活动期间我们将限量发售HEXA工程机,不搞减满不用抽券,售价直降1111元。不少朋友会问什么是工程机?和正式售卖的版本又有什么区别?我们特别和...阅读全文
如何得到一个对象所占内存大小? fmt.Println(unsafe.Sizeof(int64(0))) // "8" type SizeOfA struct { A int } unsafe.Sizeof(SizeOfA{0}) // 8 type SizeOfC struct { A byte // 1字节 C int32 // 4字节 } unsafe.Sizeof(SizeOfC{0, 0}) // 8 unsafe.Alignof(SizeOfC{0, 0}) // 4 结构体中A byte占1字节,C int32占4字节. SizeOfC占8字节 内存对齐: 为何会有内存对齐?1.并不是所有硬件平台都能访问任意地址上的任意数据。2.性能原因 访问未对齐的内存,处理器需要做两次内存...阅读全文
前言: 以前在刚开始搞Docker时,会使用TIG(Telegraf+Influxdb+Grafana)方案来处理Docker容器相关的监控数据,对Influxdb有一定的了解,但是由于业务场景和数据量的原因,没有过多关注。而如今,随着业务场景的丰富以及数据量的原因,需要对Influxdb进行更深入的学习和了解。 一、介绍 官网地址 为什么要使用InfluxDB 1.x? 高性能:主要是因为基于Golang编写,且使用根据时间序列优化的TSM存储引擎 类SQL查询:提供InfluxQL,一个类SQL的语言,可以方便数据查询和分析(支持正则,数学计算,时间序列函数) 缩减采样和数据保留:Influxdb每秒可以处理百万条级别的数据,但是长时间处理如此体量的数据可能造成存储问题。Influxdb...阅读全文
MaxCompute是一套阿里自主研发的数据仓库解决方案。产品除了功能、性能、简单等优势外,还能在费用上节省下一大笔前。墨迹天气使用MaxCompute,除了性能和稳定性也有提升外,整体存储和计算的费用比之前节省70%。这是如何做到的呢,这里有一些常用的规则。 在讨论如何做到之前,我们先看下MaxCompute是如何计费的。根据目前的文档,目前的计费方式包含数据的存储、数据的下载以及计算费用。其中计算费用又分I/O后付费和预付费两种收费模式。I/O后付费根据实际的计算来进行收费;而预付费相当于包了几个CU只有购买者可以使用,这几个CU上随便怎么计算都不会产生计算费用。所以如何减少费用,也就是转换成如何减少存储的费用、如何减少下载的费用以及如何减少计算的费用。 存储 数据存储在M...阅读全文
etcd是将数据存储在集群中的高可用k-v存储。允许应用实时监听存储中的k-v变化。能容忍单点故障,能够应对网络分区。 (raft是一个分布式协议,管理的是日志;etcd管理的是k-v,把k-v放到日志里,kv就编程分布式集群了)(调用者写入请求发给leader请求写入k-v,leader会将日志实时向follower们复制,leader不会立即返回给调用者,会马上往集群follower做日志拷贝。当日志被复制给N+1个节点后(即大多数),本地提交(也就是告诉客户端提交成功),返回给调用者(客户端),为什么复制给N+1,而不是2N+1后就告诉客户端成功了呢?这就是大多数协议,也就是抽屉理论的重要表现)(一旦完成提交,leader会周期性把自己的提交信息告诉所有follower,这样,其他fo...阅读全文
随着业务越来越复杂,数据量越来越大,并发量越来越大,数据库的性能越来越低。好不容易找运维申请了两台机器,让DBA部署了几个实例,想把一些业务库拆分出来,却发现拆不出来,扩不了容,尴尬! 因为数据库强关联在一起,无法通过增加数据库实例扩容,就是一个耦合的典型案例。 场景还原有一个公共用户数据库DB_USER,里面table_user存放了通用的用户数据:table_user (uid, name, passwd, …) 在数据量比较小,并发量比较小,业务还没有这么复杂的时候,为了提高资源利用率(程序员才没有考虑什么资源利用率,更多的是图方便),业务A把用户个性化的数据也放在这个库里:table_A(uid, A业务的个性化属性) 业务A有一个需求,即要展现用户公共属性,又要展现业务A个性化属性...阅读全文
摘要: uData框架设计之初的思想是基于传统sensorhub概念基础之上的,结合IoT的业务场景和AliOS Things物联网操作系统的特点设计而成的一个面对IoT的感知设备处理框架。 **点此查看原文**:http://click.aliyun.com/m/40592/ **uData诞生背景** uData框架设计之初的思想是基于传统sensorhub概念基础之上的,结合IoT的业务场景和AliOS Things物联网操作系统的特点设计而成的一个面对IoT的感知设备处理框架。uData的主要目的是为了解决IoT端侧设备传感器开发的周期长、应用算法缺少和无云端数据一体化等痛点问题。 **uData概要介绍** uData设计之初是遵循分层解耦...阅读全文
1.导读 Sigmax是涂鸦智能中间件团队基于Golang开发的一款高性能,分布式的定时任务调度引擎。针对IoT领域特有的复杂多样的定时任务场景,Sigmax提供了一套统一,稳定,精准的定时调度平台,来协助公司内各业务线方便的实现定时场景。 目前Sigmax已经在公司内部稳定运行了1年时间,单集群的日任务调度、日均任务触发数达千万次。 2.背景 涂鸦智能作为全球领先的AI+IoT平台,连接着海量的智能设备,每天会有大量的用户控制自己的智能设备以实现一些智能化的场景,比如: 用户A,每天早上7点自动打开窗帘; 用户B,当访客通过智能门禁之后,定时移除访客的权限; 用户C,日出或者日落之后,延时执行一个联动的场景,等等; 除此之外,我们的内部服务之间也存在大量的定时任务,比如: BI同学每天定时...阅读全文
题目:设计一个身份证查询系统,将身份证号md5 之后存储,输入md5值查询对应的身份证号。 要求:成本低,查询速度快 设计思路: 将所有可能的身份证号做一个简单的统计计算数据量 根据数据量选择存储方式 查询 身份证生成规则: 身份号码是特征组合码,由前十七位数字本体码和最后一位数字校验码组成。排列顺序从左至右依次为六位数字地址码,八位数字出生日期码,三位数字顺序码和一位数字校验码。 地址码: 表示编码对象常住户口所在县(市、旗、区)的行政区划代码。对于新生儿,该地址码为户口登记地行政区划代码。需要没说明的是,随着行政区划的调整,同一个地方进行户口登记的可能存在地址码不一致的情况。行政区划代码按GB/T2260的规定执行。 出生日期码:表示编码对象出生的年、月、日,年、月、日代码之间不用分隔符...阅读全文
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif; font-size: 15px } p { line-height: 25.6px; text-align: justify; margin: 23.7px 0 } blockquote { border-left: 2px solid rgba(128,128,128,0.075); background-color: rgba(128,128,128,0.05); padding: 10px -1px; margin: 0px } bl...阅读全文
摘要: 开源时序数据库 如图是17年6月在db-engines上时序数据库的排名,我会挑选开源的、分布式的时序数据库做详细的解析。前十的排名中,RRD是一个老牌的单机存储引擎,Graphite底层是Whisper,可以认为是一个优化的更强大的RRD数据库。 开源时序数据库 image 如图是17年6月在db-engines上时序数据库的排名,我会挑选开源的、分布式的时序数据库做详细的解析。前十的排名中,RRD是一个老牌的单机存储引擎,Graphite底层是Whisper,可以认为是一个优化的更强大的RRD数据库。kdb+、eXtremeDB和Axibase都未开源,不做解析。InfluxDB开源版和Prometheus的底层都是基于levelDB自研的单机的存储引擎,I...阅读全文
package main import ( "go.etcd.io/etcd/clientv3" "time" "fmt" "context" ) func main() { var ( config clientv3.Config client *clientv3.Client err error kv clientv3.KV putOp clientv3.Op getOp clientv3.Op opResp clientv3.OpResponse ) // 客户端配置 config = clientv3.Config{ Endpoints: []string{"0.0.0.0:2379"}, DialTimeout: 5 * time.Second, } // 建立连接 if clie...阅读全文
 ℹ️*这篇文章基于 Go 1.13 编写。* Go 的一系列内存管理手段(内存分配,垃圾回收,内存访问检查)使许多开发者的开发工作变得很轻松。编译器通过在代码中引入“边界检查” 来确保安全地访问内存。 ## 生成的指令 Go 引入了一些控制点...阅读全文
你想建设一个能承受500万PV/每天的网站吗? 500万PV是什么概念?服务器每秒要处理多少个请求才能应对?如果计算呢? PV是什么: PV是page view的简写。PV是指页面的访问次数,每打开或刷新一次页面,就算做一个pv。 计算模型: 每台服务器每秒处理请求的数量=((80%总PV量)/(24小时60分60秒40%)) / 服务器数量 。 其中关键的参数是80%、40%。表示一天中有80%的请求发生在一天的40%的时间内。24小时的40%是9.6小时,有80%的请求发生一天的9.6个小时当中(很适合互联网的应用,白天请求多,晚上请求少)。 简单计算的结果: ((80%500万)/(24小时60分60秒40%))/1 = 115.7个请求/秒 ((80%100万)/(24小时60分60...阅读全文
前言 在上一篇文章《Golang实现简单爬虫框架(3)——简单并发版》中我们实现了一个最简单并发爬虫,调度器为每一个Request创建一个goroutine,每个goroutine往Worker队列中分发任务,发完就结束。所有的Worker都在抢一个channel中的任务。但是这样做还是有些许不足之处,比如控制力弱:所有的Worker在抢同一个channel中的任务,我们没有办法控制给哪一个worker任务。 其实我们可以自己做一个任务分发的机制,我们来决定分发给哪一个Worker 注意:本次并发是在上一篇文章简单并发实现的基础上修改,所以没有贴出全部代码,只是贴出部分修改部分,要查看完整项目代码,可以查看上篇文章,或者从github下载项目源代码查看 1、项目架构 在上一篇文章实现简单并发...阅读全文
UI设计师 职位详情 负责产品UI视觉设计与用户体验,能独立完成设计任务。 与团队合作,针对复杂抽象的问题设计清晰有效的解决方案。 准确理解产品需求和交互原型,设计出优质用户体验的界面效果图。 参与产品分析、创意以及交互体验优化,并提出建设性意见。 规范产品在用户体验上的统一性和一致性。 任职要求 本科及以上学历,设计类相关专业,2年以上的互联网或移动互联网设计经验。 有互联网公司工作经验,主导过上线项目。 精通各类交互与视觉设计,熟悉iOS、Android端的官方设计规范,同时是深度用户。 重视细节,追求像素级完美,热爱人机交互与用户洞察,对设计探索有浓厚兴趣,自我驱动力强。 具备一定的产品思维和较好的用户同理心,能够参与用户研究、交互设计、设计原型开发等工作。 后端开发工程师 职位详情 ...阅读全文
最近写项目,需要用到信号量等待一些资源完成,但是最多等待N毫秒。 在C语言里,有如下的API来实现带超时的信号量等待: C 12345 SYNOPSIS #include
* { color: #3e3e3e } body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif; font-size: 15px } p { line-height: 25.6px; text-align: justify; margin: 23.7px 0 } blockquote { border-left: 2px solid rgba(128,128,128,0.075); background-color: rgba(128,128,128,0.05); padding: 10px -1px; margin: 0px } bl...阅读全文
摘要: HBase可以说是一个数据库,也可以说是一个存储。拥有双重属性的HBase天生就具备广阔的应用场景。在2.0中,引入了OffHeap降低了延迟,可以满足在线的需求。引入MOB,可以存储10M左右的对象,完全适应了对象存储。另外由于自身的并发能力、存储能力,可以说是具有最为竞争力的引擎 **HBase概述** HBase是一个分布式存储、数据库引擎,可以支持千万的QPS、PB级别的存储,这些都已经在生产环境验证,并且在广大的公司已经验证。特别是阿里、小米、京东、滴滴内部都有数千、上万台的HBase集群。选择一个技术的首要条件是对齐大公司,大公司会投入大量的人力去维护、改进、贡献社区。 **关于NewSQL与NoSQL的关系** 技术总是不断向前发展的,如今都在提...阅读全文
日志数据是最常见的一种海量数据,以拥有大量用户群体的电商平台为例,双 11 大促活动期间,它们可能每小时的日志数量达到百亿规模,海量的日志数据暴增,随之给技术团队带来严峻的挑战。本文将从海量日志系统在优化、部署、监控方向如何更适应业务的需求入手,重点从多种日志系统的架构设计对比;后续调优过程:横向扩展与纵向扩展,分集群,数据分治,重写数据链路等实际现象与问题展开。我自己是一个从事了6年的Java全栈工程师,最近整理了一套适合2019年学习的Java\大数据资料,从基础的Java、大数据面向对象到进阶的框架知识都有整理哦,可以来我的主页免费领取哦。日志系统架构基准有过项目开发经验的朋友都知道:从平台的最初搭建到实现核心业务,都需要有日志平台为各种业务保驾护航。 如上图所示,对于一个简单的日志应...阅读全文
分布式任务调度平台 前言 在企业系统开发过程中难免少不了一些定时任务来进行定时触发执行任务,对于非分布式环境系统中,我们只需要在对应系统中内部集成一些调度库进行配置定时触发即可。 比如:使用Spring框架集成quartz,只需要进行一些简单的配置就能定时执行任务了。但是随着企业的系统越来越多、逐步从单一应用慢慢演变为微服务集群。 在分布式集群系统中主要面临出如:任务的重复执行、没有统一定时任务配置、任务节点故障转移、任务监控&报警等一些列的功能都是要在分布式系统中进行解决。 此分布式的定时任务调度平台,它非常轻量小巧,使用简单,后端以中心服务器为调度核心,负责集群中各种任务的动态分配和调度执行。 在平台前端支持Web界面可视化管理,我们可以创建、暂停/启动任务、删除未执行的任务快照、或者查...阅读全文