每日新闻

每日新闻

GoCN每日新闻资讯
有问必答

有问必答

Go相关的问题,技术相关的问题
文章分享

文章分享

技术文章分享,让知识传播给更多的人
招聘应聘

招聘应聘

为Gopher服务的招聘应聘平台

GoCN每日新闻(2020-01-16)

回复

每日新闻moss 发起了问题 • 1 人关注 • 0 个回复 • 3892 次浏览 • 2020-01-16 17:09 • 来自相关话题

GoCN每日新闻(2020-01-15)

回复

每日新闻moss 发起了问题 • 1 人关注 • 0 个回复 • 4406 次浏览 • 2020-01-15 15:20 • 来自相关话题

聊聊图数据库和图数据库的小知识 Vol.02

文章分享NebulaGraph 发表了文章 • 0 个评论 • 371 次浏览 • 2020-01-15 10:27 • 来自相关话题

about graph database


2010 年前后,对于社交媒体网络研究的兴起带动了图计算的大规模应用。


2000 年前后热门的是 信息检索分析 ,主要是 Google 的带动,以及 Amazon 的 e-commerce 所用的协同过滤推荐,当时 collaborative filtering也被认为是 information retrieval 的一个细分领域,包括 Google 的 PageRank 也是在信息检索领域研究较多。后来才是 Twitter,Facebook 的崛起带动了网络科学 network science的研究。


图理论和图算法不是新科学,很早就有,只是最近 20 年大数据,网络零售和社交网络的发展, big datasocial networkse-commerce 、IoT让图计算有了新的用武之地,而且硬件计算力的提高和分布式计算日益成熟的支持也使图在高效处理海量关联数据成为可能。


上文摘录了#聊聊图数据库和图数据库小知识# Vol.01 的【图数据库兴起的契机】,在本次第二期#聊聊图数据库和图数据库小知识#我们将了解以下内容,如果有感兴趣的图数据库话题,欢迎添加 Nebula 小助手微信号:NebulaGraphbot 为好友进群来交流图数据库心得。


本文目录



  • 图数据库和图数据库设计

    • 传统数据库通过设计良好的数据结构是不是可以实现图数据库的功能

    • 图数据库会出于什么考虑做存储计算分离

    • 数据量小,业务量小的情况下,是否单机部署图数据库性能也不错。

    • 图数据库 shared-storage 和 shared-nothing 的比较

    • 图数据库顶点和边输出及超级顶点输出优化

    • 如何处理图数据库中大数据量的点?



  • Nebula Graph 实践细节

    • Nebula Graph 元数据(Meta Service)使用 etcd 吗?

    • Nebula Graph Cache 位于那一层

    • Nebula Graph 集群中的 Partition 多大

    • 如何理解 Nebula Graph Partition




图数据库和图数据库设计


在这个部分,我们会摘录一些图数据库设计通用的设计思路,或者已有图数据库的实践思考。


传统数据库通过设计良好的数据结构是不是可以实现图数据库的功能


图数据库相对传统数据库优化点在于,数据模型。传统数据库是一个关系型,是一种表结构做 Join,但存储结构表明了很难支持多度拓展,比如一度好友,两度好友,一度还支持,使用一个 Select 和 Join 就可完成,但是二度查询开销成本较大,更别提多度 Join 查询开销更大。图数据库的存储结构为面向图存储,更利于查询多度关系。特别的,有些图上特有的操作,用关系型数据库比较难实现和表达,比如最短路径、子图、匹配特定规则的路径这些。


图数据库会出于什么考虑做存储计算分离


存储与计算分离主要出于以下四方面的考虑:



  1. 存储和计算资源可以独立扩展,使资源利用更充分,达到缩减成本的目的。

  2. 更容易利用异构机型。

  3. 解耦计算节点,计算资源可以更大程度地做到线性扩展。基于之前的项目经历,存储计算不分离的分布式架构,计算能力的水平扩展会比较不方便。举个例子,在好友关系这种场景——基于好友关系查询再做一些排序和计算,在某个节点查询执行过程中需要去其他节点获取数据,或者将某个子计算交给其他节点,如果执行过程中需要的数据存储在本地,相较存储计算分离效率可能会高;但当涉及到和其他节点通信问题时,为了扩容计算资源而增加的机器会使得计算过程中的网络开销相应增加,抵消了相当一部分的计算能力。如果存储计算分离,计算和存储一对一,不存在节点越多网络通讯开销越大的问题。

  4. Nebula Graph在存储层提供基于图的查询接口,但不具备运算能力,方便对接外部的批量计算,比如 Spark,可以将图存储层当作为图索引存储,直接批量扫描、遍历图自行计算,这样操作更灵活。存储层支持做一些简单的过滤计算,比如找寻 18 岁好友等过滤操作。


数据量小,业务量小的情况下,是否单机部署图数据库性能也不错。


单机按分布式架构部署,有一定网络开销因为经过网卡,所以性能还行。一定要分布式架构部署的原因在于强一致、多副本的业务需求,你也可以按照业务需求部署单副本。


图数据库 Shared-storage 和 Shared-nothing 的比较


【提问】对于图数据库来说,是不是 shared-storage 相比 shared-nothing 方式更好呢。因为图的节点间是高度关联的,shared-nothing 方式将这种联系拆掉了。对于多步遍历等操作来说,需要跨节点。而且由于第二步开始的不确定性,要不要跨节点好像没法提前通过执行计划进行优化。


【回复】交流群群友 W:errr,单个 storage 能不能放下那么多数据,特别数据量增加了会是个比较麻烦的问题。另外第二步虽然是随机的,但是取第二步数据的时候可以从多台机器并发


【回复】交流群群友 W:主要的云厂商,比如 AWS 的共享存储可以到 64 T,存储应该够,而且这种方式存储内部有多副本。顺便提一句:AWS 的 Neptune 的底层存储用的也是 Aurora 的那个存储。网络这块的优化,可参考阿里云的 Polarstore,基本上网络已经不是什么问题了。


image.png


此外,“第二步虽然是随机的,但是取第二步数据的时候可以从多台机器并发吧”这个倒是,Nebula 有个 storage server 可以做这个事情,但逻辑上似乎这个应该是 query engine 应该干的。


【回复】交流群群友 W:“网络这块的优化,可参考阿里云的 polarstore,基本上网络已经不是什么问题了。” 网络这问题,部署环境的网络不一定可控,毕竟机房质量参差不齐,当然云厂商自己的机房会好很多。


【回复】交流群群友 W:这个确实。所以开源的创业公司走 shared-nothing,云厂商走 shared-storage,也算是都利用了各自的优势


【回复】交流群群友 S:其实,shared-storage 可以被看成是一个存储空间极大的单机版,并不是一个分布式系统


【回复】交流群群友 W:嗯嗯。不过 Neptune 那种跟单机版的区别在于计算那部分是可扩展的,一写多读,甚至 Aurora 已经做到了多写。不过就像前面所说的,开源的东西基于那种需定制的高大上存储来做不现实。想了下拿 AWS 的存储做对比不大合适,存储内部跨网络访问的开销还是一个问题,拿 Polarstore 这种 RDMA 互联更能说明。可能 2 种方案都差不多,本质上都是能否减少跨网络访问的开销。


图数据库顶点和边输出及超级顶点输出优化


【提问】请教一个问题。Nebula 的顶点和出边是连续存放的。那么在查询语句进行 IO 读取时,是顶点和出边会一起读出来呢,还是根据查询语句的不同而不同?


【回复】交流群群友 W:会一个 block 一起读出来


【回复】交流群群友 W:恩恩。对于 supernode 这种情况,有没有做什么优化?Titian/Janusgraph 有一个节点所有边的局部索引,Neo4j 应该有在 object cache 中对一个节点的边按照类型组织


【回复】交流群群友 S:Nebula 也是用 index 来解决这个问题


【回复】交流群群友 W:Neo4j 的 relationship group 是落在存储上的,请教下,Nebula 的这种 index 和 Janusgraph 的 vertex centric 索引类似麽,还是指存储格式里面的 ranking 字段啊


【回复】交流群群友 S:类似于 Janusgraph 的索引,但是我们的设计更 general,支持 multi-column 的索引


【回复】交流群群友 W:ranking 字段其实给客户用的,一般可以拿来放时间戳,版本号之类的。


如何处理图数据库中大数据量的点?


【提问】:Nebula 的存储模型中属性和边信息一起存储在顶点上,针对大顶点问题有好的解决方案吗?属性和关系多情况下,针对这种实体的查询该怎么处理,比如:比如美国最有名的特产,中国最高的人,浙江大学年龄最大的校友


【回复】交流群群友 W:如果可以排序,那分数可以放在 key 上,这样其实也不用 scan 太多了,ranking 字段就可以放这个。要不然还有个办法是允许遍历的过程中截断或者采样,不然很容易爆炸的。


【回复】交流群群友 B:在做实时图数据库的数据模型设计时,尽量避免大出入度的节点。如果避免不了,那至少避免此类节点再往后的 traversal。如果还是避免不了,那别指望这样的查询会有好的性能


【回复】交流群群友 H:单纯的大点如果不从它开始 traversal,其实问题也不大。load 的 unbalance 都是有办法解决的。数据的 unbalance 因为分 part 存储,在分配 part 到 host 时可加入 part 数据量的权重,而 load 的 unbalance,对于读,可通过拓展只读副本 + cache 解决,写的话,可做 group commit,client 也可以做本地 cache。


【回复】交流群群友 B:图数据库的一个查询的性能最终取决于 physical block reads 的数量。不同方案会导致最后 block reads 不一样,性能会有差别。任何一种方案不可能对所有查询都是优化的,最终往往就是 tradeoff。主要看你大部分实际的 query pattern 和数据分布式如何,该数据库实现是否有优化。拆边和不拆边,各有其优缺点。


Nebula Graph 实践细节


在这个部分我们会摘录一些开源的分布式图数据库 Nebula Graph 在实践过程中遇到的问题,或者用户使用图数据库 Nebula Graph 中遇到的问题。


Nebula Graph 元数据(Meta Service)使用 etcd 吗?


不是。Meta Service的架构其实和 Storage Service 架构类似,是个独立服务。


Nebula Graph Cache 位于哪一层


A:KV 那层。目前只有针对顶点的 Cache,顶点的访问具有随机性,如果没有 Cache,性能较差。Query Plan 那层现在还没有。


如何理解 Nebula Graph Partition


partition 是个逻辑概念,主要目的是为了一个 partition 内的数据可以一起迁移到另外一台机器。partition 数量是由创建图空间时指定的 partition_num 确立。而单副本 partition 的分布规则如下


image.png


通过算子:partID%engine_size,而多副本的情况,原理类似,follower 在另外两个机器上。


Nebula Graph 集群中的 Partition 多大


A:部署集群时需要设置 Partition 数,比如 1000 个 Partition。插入某个点时,会针对这个点的id做 Hash,找寻对应的 Partition 和对应 Leader。PartitionID 计算公式 = VertexID % num_Partition


单个 Partition 的大小,取决于总数据量和 Partition 个数;Partition 的个数的选择取决于集群中最大可能的机器节点数,Partition 数目越大,每个 Partition 数据量越小,机器间数据量不均匀发生的概率也就越小。


最后,这里是开源的分布式图数据库 Nebula Graph 的 GitHub 地址:github.com/vesoft-inc/…,欢迎给我们提 issue~~


推荐阅读



go-kit 微服务 系列文章归档

Golanghwholiday 发表了文章 • 0 个评论 • 245 次浏览 • 2020-01-15 09:16 • 来自相关话题

## go-kit 微服务 系列文章归档 - go-kit 里面核心的东西有三层分别是:Transport、Endpoint、Service + Transport 层主要负责与网络层相关逻辑 + Endpoint ...查看全部

## go-kit 微服务 系列文章归档

- go-kit 里面核心的东西有三层分别是:Transport、Endpoint、Service
+ Transport 层主要负责与网络层相关逻辑
+ Endpoint 层主要负责请求数据与返回数据格式的转换,以及公用中间件逻辑
+ Service 层业务逻辑

### go-kit 更像是一个微服务的工具集,而不是一个完整的框架,里面包含了限流,日志,服务注册与发现,熔断,服务监控,链路追踪等相关工具方法

## 归档

* [go-kit 微服务 基础使用 (HTTP)](https://www.hwholiday.com/2019/go_kit_v1/)

* [go-kit 微服务 添加日志(user/zap ,并为每个请求添加UUID)](https://www.hwholiday.com/2020/git_kit_v2/)

* [go-kit 微服务 身份认证 (JWT)](https://www.hwholiday.com/2020/go_kit_v3/)

* [go-kit 微服务 限流 (uber/ratelimit 和 golang/rate 实现)](https://www.hwholiday.com/2020/go_kit_v4/)

* [go-kit 微服务 使用GRPC(并为每个请求添加UUID)](https://www.hwholiday.com/2020/go_kit_v5/)

* [go-kit 微服务 服务注册与发现(etcd实现)](https://www.hwholiday.com/2020/go_kit_v6/)

* [go-kit 微服务 服务监控(prometheus 实现)](https://www.hwholiday.com/2020/go_kit_v7/)

* [go-kit 微服务 服务熔断(hystrix-go 实现)](https://www.hwholiday.com/2020/go_kit_v8/)

* [go-kit 微服务 服务链路追踪(jaeger 实现)(1)](https://www.hwholiday.com/2020/go_kit_v9/)

* [go-kit 微服务 服务链路追踪(jaeger 实现)(2)](https://www.hwholiday.com/2020/go_kit_v10/)

### [完整代码示例](https://github.com/hwholiday/learning_tools/tree/master/go-kit) (go-kit微服务)

## 联系 QQ: 3355168235

GoCN每日新闻(2020-01-14)

回复

每日新闻EasyHacking 发起了问题 • 1 人关注 • 0 个回复 • 4730 次浏览 • 2020-01-14 15:53 • 来自相关话题

golang写的即时通讯服务器gim,支持TCP,WebSocket

开源程序Alber 发表了文章 • 0 个评论 • 269 次浏览 • 2020-01-14 09:45 • 来自相关话题

https://github.com/alberliu/gim ...查看全部

Dig101: Go之灵活的slice

Golangnewbmiao 发表了文章 • 0 个评论 • 204 次浏览 • 2020-01-13 21:08 • 来自相关话题

Dig101: dig more, simplified more and know moreSlice作为go常用的数据类型,在日常 ...查看全部

Dig101: dig more, simplified more and know more

Slice作为go常用的数据类型,在日常编码中非常常见。
相对于数组的定长不可变,slice使用起来就灵活了许多。


文章目录

0x01 slice 到底是什么?
0x02 slice能比较么?
0x03 花样的切片操作
0x04 append 时发生了什么?
0x05 append内部优化
- 扩容的策略是什么?
- 扩容判断中uint的作用是啥?
- 内存清零初始化: memclrNoHeapPointers vs typedmemclr?


可以移步 微信版 阅读

GoCN每日新闻(2020-01-13)

回复

每日新闻smallfish1 发起了问题 • 1 人关注 • 0 个回复 • 5178 次浏览 • 2020-01-13 10:48 • 来自相关话题

bufio包去读TCP数据不能读全的问题

回复

Golangzhougb3 发起了问题 • 1 人关注 • 0 个回复 • 240 次浏览 • 2020-01-12 20:52 • 来自相关话题

GoCN每日新闻(2020-01-12)

回复

每日新闻lwhile 发起了问题 • 1 人关注 • 0 个回复 • 5583 次浏览 • 2020-01-12 08:55 • 来自相关话题

gin自动路由中间件

开源程序chenqinghe 发表了文章 • 0 个评论 • 236 次浏览 • 2020-01-11 17:28 • 来自相关话题

github地址: https://git ...查看全部

github地址: https://github.com/chenqinghe/gin-autorouter


gin-autorouter

gin-autorouter is a middleware which could automatic mapping request url to a handler method.

Api

the project have two main functions:

  • AutoRouter
  • RouterAny

Basic Uage

package main


type T struct{

}

func (t *T)Greet(c *gin.Context) {
c.Writer.WriteString("hello from *T.Greet")
}

func (t *T)Hello(c *gin.Context) {
c.Writer.WriteString("hello from *T.Hello")
}


func main(){
r:=gin.Default()
r.Any("/*path",router.AutoRouter(&T{}))
r.Run(":8080")
}

you only need to register a router with pattern "/*path"

view http://localhost:8080/greet, you could see "hello from *T.Greet"

view http://localhost:8080/hello, you will see "hello from *T.Hello"

RESTful Api

with AutoRouter, you can create restful api very easily.

package main

func (h *Article) Get(c *gin.Context) {
articleId := c.Param("id")
// search artile stuff.....
article := model.SearchArticle(articleId)
c.JSONP(http.StatusOK,article)
}

func (h *Article)Delete(c *gin.Context) {
articleId := c.Param("id")
model.DeleteArticle(articleId)
c.JSONP(http.StatusOK,"ok")
}

func main(){
r := gin.Default()
r.Any("/article/:id",router.AutoRouter(&Article{}))
}

// * GET /article/123 => *Article.Get
// * Delete /article/123 => *Article.Delete

also, you can use RouterAny, things will be extremely easy!!

package main

func (h *Article)Get(c *gin.Context, id int) {
fmt.Println("article:",id) // output: article: 123
article := model.SearchArticle(id)
c.JSONP(http.StatusOK,article)
}

func (h *Article)Delete(c *gin.Context, id int) {
fmt.Println("article:",id) // output: article: 123
model.DeleteArticle(id)
c.JSONP(http.StatusOK,"ok")
}


func main(){
r:= gin.Default()
r.Any("/*path",router.RouterAny(&Article{}))
}

// GET /article/123 => *Article.Get(c, 123)
// DELETE /article/123 => *Article.Delete(c, 123)

Mapping Rules

the mapping is basic on *gin.Context.Param("path"). path will be exploded to several segments by '/'

  • if path is empty, method is request http method
  • the first segment is method
  • others will be method arguments
  • segments number MUST be equal or greater than method arguments number
  • if method is variadic, the segments mapping to last argument could be zero
  • otherwise, "404 not found" will be returned

some examples:

pathmethodarguments(exclude *gin.Context)
/REQUEST METHODnil
/foofoonil
/foo/barfoo[bar]
/foo/bar/123foo[bar,123]

License

the project is under MIT license protected which you can find in LICENSE file.

GoCN每日新闻(2020-01-11)

回复

每日新闻mahuaibo 发起了问题 • 1 人关注 • 0 个回复 • 5694 次浏览 • 2020-01-11 13:16 • 来自相关话题

GoCN每日新闻(2020-01-10)

回复

每日新闻DennisMao 发起了问题 • 1 人关注 • 0 个回复 • 5647 次浏览 • 2020-01-10 18:52 • 来自相关话题

Go 开发者进阶周刊(Jan week 2)

进阶周刊dyq 发表了文章 • 0 个评论 • 1149 次浏览 • 2020-01-10 00:11 • 来自相关话题

语言学习(Golang 编程知识与技巧) ...查看全部

语言学习(Golang 编程知识与技巧)

1.Go编程语言规范

一份很详细的 Go 编程语言的参考手册。

2.Go网络文件传输

借助TCP完成文件的传输,基本思路如下:

  1. 发送方(客户端)向服务端发送文件名,服务端保存该文件名。
  2. 接收方(服务端)向客户端返回一个消息ok,确认文件名保存成功。
  3. 发送方(客户端)收到消息后,开始向服务端发送文件数据。
  4. 接收方(服务端)读取文件内容,写入到之前保存好的文件中。

由于文件传输需要稳定可靠的连接,所以采用TCP方式完成网络文件传输功能。 

3.Go 编程: 对不起,你的 CPU 泄露了 

前段时间给后端几个服务配证书,试着用了一下 Cert-Manager 项目。 Github 几千 Star 的项目使用起来的确很方便,秒配域名免费证书。但是,运行了三天,机器CPU报警。赶紧去项目 issues 里搜,果真遇到类似不止一个, 第二天这个问题就修复了。

4.小改动,大提升:Go 标准库的一次优化 

Carlo Alberto Ferraris提交了一个对math/rand库中的lockedSource优化的pr(CL#191538),核心代码其实只有一行,却带来了相对的巨大的性能提升,让我们一起老看看这次的修改,学习一下代码的优化技巧,提高我们Go语言的底层优化经验。

5.高频 golang 服务接口超时排查&性能调优 

业务中超时抖动是大家平时比较容易遇到的一种技术问题,本文详细记录了一次线上容器中高频 go 服务超时的排查过程。本文可以给大家提供查服务业务超时问题的一些思路,理解为什么 go 服务会获取错 cpu 核数,了解获取宿主 cpu 核数会有多大影响并怎样最小成本避开。

6.Go语言学习Sync.Pool

假设我们需要频繁申请内存用于存放你的结构体, 而这个结构体本身是短命的, 可能这个请求过去你就不用了. 申请了这么多内存, 对于GC来说就是一种压力了. 针对这个问题, 如果我们能产生一个池子, 用于存放这些短命内存, 理想情况中下次请求来了, 直接从池子中拿就好了, 那么GC的时候我们直接清理池子就完事了, 算是一种GC的优化套路.

7.Go之for-range排坑指南

golang 常用的遍历方式,有两种:for 和 for-range。而 for-range 使用中有些坑常会遇到,今天我们一起来捋一捋。

8.Go语言使用TCP_NODELAY控制发包流量[译]

编写健壮且高性能的网络服务需要付出大量的努力。提高服务性能的方式有很多种,比如优化应用层的代码,更进一步,还可以看看垃圾回收器,操作系统,网络传输,以及部署我们服务的硬件是否有优化空间。

TCP/IP协议栈中的一些算法会影响到服务性能。本文将简单介绍其中的Nagle算法,与Nagle算法相关的socket选项TCP_NODELAY,以及在Go语言中如何使用它。

9.Golang context机制

Context通常被译作上下文,是一个比较抽象的概念。一般理解为程序单元的一个运行状态、现场、快照,而翻译中上下文又很好地诠释了其本质。

每个Goroutine在执行前,都要先知道程序当前的执行状态,通常将这些执行状态封装在一个Context变量中,传递给要执行的Goroutine中。上下文则几乎已经成为传递与请求同生存周期变量的标准方法。在网络变成下,当接收到一个网络请求Request,处理Request时,我们可能需要开启不同的Goroutine来获取数据和执行程序逻辑,即一个请求Request,会在多个Goroutine中处理。而这些Goroutine可能需要共享Request的一些信息;同时当Request被取消或者超时的时候,所有从这个Request创建的所有Goroutine也应该被结束。

10.《Go语言程序设计》读书笔记(六) 基于共享变量的并发

一个函数在线性程序中可以正确地工作。如果在并发的情况下,这个函数依然可以正确地工作的话,那么我们就说这个函数是并发安全的,并发安全的函数不需要额外的同步工作。我们可以把这个概念概括为一个特定类型的一些方法和操作函数,如果这个类型是并发安全的话,那么所有它的访问方法和操作就都是并发安全的。 


工程实践(Go的项目应用实践)

1.Go 的内存对齐和指针运算详解和实践

uintptr

在 Go 的源码中 uintptr 的定义如下:

/* 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


unasfe

在 Go 中,unsafe 是一个包,内容也比较简短,但注释非常多,这个包主要是用来在一些底层编程中,让你能够操作内存地址计算,也就是说 Go 本身是不支持指针运算,但还是留了一个后门,而且 Go 也不建议研发人员直接使用 unsafe 包的方法,因为它绕过了 Go 的内存安全原则,是不安全的,容易使你的程序出现莫名其妙的问题,不利于程序的扩展与维护。

2.eBay邓明:dubbo-go 中 metrics 的设计

最近因为要在 Apache/dubbo-go(以下简称 dubbo-go )里面实现类似的这个 metrics 功能,于是花了很多时间去了解现在 Dubbo 里面的 metrics 是怎么实现的。该部分,实际上是被放在一个独立的项目里面,即 metrics 。 

3.Go在MacOS创建一个自定义的命令行工具

使用 MacOS 做开发的朋友都知道,我们一般会使用 Homebrew 做软件包管理,经常会用到 brew install [soft] 来安装各种各样的命令行软件。今天通过一个百科查找的命令行工具(tellme)示例,我们来学习一下如何使用 Go 语言开发自己的命令行软件。

我们需要用到 cobra 这个 Go 模块来做命令行工具开发,这个开源库其实是对 Go 官方库 flag 的一个封装,可以简化获取参数的操作。

4.复杂分布式架构下的计算治理之路

在当前的复杂分布式架构环境下,服务治理已经大行其道。但目光往下一层,从上层 APP、Service,到底层计算引擎这一层面,却还是各个引擎各自为政,Client-Server 模式紧耦合满天飞的情况。如何做好“计算治理”,让复杂环境下各种类型的大量计算任务,都能更简洁、灵活、有序、可控的提交执行,和保障成功返回结果?计算中间件 Linkis 就是上述问题的最佳实践。

5.100 行写一个go的协程池(任务池)

go 的 goroutine 提供了一种较线程而言更廉价的方式处理并发场景, go 使用二级线程的模式, 将 goroutine 以 M:N 的形式复用到系统线程上, 节省了 cpu 调度的开销, 也避免了用户级线程(协程)进行系统调用时阻塞整个系统线程的问题。【1】

但 goroutine 太多仍会导致调度性能下降、GC 频繁、内存暴涨, 引发一系列问题。在面临这样的场景时, 限制 goroutine 的数量、重用 goroutine 显然很有价值。

本文正是针对上述情况而提供一种简单的解决方案, 编写一个协程池(任务池)来实现对 goroutine 的管控。


生态拓展(云原生等 Go 生态体系)

1.Kubernetes设计的4个原则 

今天我要带给大家的是2018年底,在西雅图举办的Kubecon的一场分享,来自谷歌K8s团队的工程师Saad Ali分享的《Kubernetes设计原则》。这场会议虽然已经过去一年多了,但是我觉得本会议的内容非常值得学习,我们大都知道K8s是如何工作的,但是本文带我们了解k8s背后的设计原则,以及为什么要这样设计。

2.分析并解决遗留应用迁移至Kubernetes后延迟增加的问题 

上周我们团队忙着将一个微服务迁移到中央平台上,包括CI/CD,Kubernetes运行时,metric和其他一些程序。这次实验是为了之后一个月里大概150个微服务的迁移作准备,所有这些服务支撑着西班牙在线市场的运营。

当我们将应用程序部署到Kubernetes上,并且将一些生产流量导入其中之后,事情开始有些不妙了。Kubernetes上的请求延迟比EC2上的高10倍左右。除非我们能找到解决方案,不然这会是微服务迁移的最大障碍,甚至可能彻底摧毁整个项目。

3.清晰架构(Clean Architecture)的Go微服务: 日志管理

良好的日志记录可以提供丰富的日志数据,便于在调试时发现问题,从而大大提高编码效率。 记录器提供的自动化信息越多越好,日志信息也需要以简洁的方式呈现,便于找到重要的数据。

4.Serverless Kubernetes 入门:对 Kubernetes 做减法

Serverless Kubernetes 是阿里云容器服务团队对未来 Kubernetes 演进方向的一种探索,通过对 Kubernetes 做减法,降低运维管理负担,简化集群管理,让 Kubernetes 从复杂到简单。

5.Kubernetes 容器平台安全实施方案

Kubernetes 容器平台的安全,牵涉到平台的各个层面:服务器,操作系统, Docker 运行环境,容器, Kubernetes 运行环境等。

容器运行在服务器上,服务器和操作系统安全应该是容器平台安全的第一道防线。关于主机和内核安全的资料和文档已经非常的丰富,不是我们这篇文档关注的重点,我们以下就其他几个层面展开。


开源项目(社区新涌现的开源成果)


jql用Go语言实现的JSON查询处理器

rqlite:Go 实现分布式 SQLite

 

彩蛋(活动与招聘)


01.04 Gopher Meetup Plus 深圳站活动 PPT下载

  • ž   Asta——Go在工业领域的应用实践
  • ž   腾讯——Go性能优化之路
  • ž   广发证券——Go与极限性能实践
  • ž   OPPO——云平台存储系统架构设计与容器化实践
  • ž   平安科技——从面试题目到Golang汇编
  • ž   腾讯——如何向Go官方提交代码
  • ž   华为云——KubeEdge:云原生边缘计算平台的Golang实践

【北京】【商汤科技招聘】Golang开发实习生 详情

【杭州】【蚂蚁金服】蚂蚁金服研发效能团队招人啦!详情

【上海】【趣头条旗下米读小说】资深后端研发/架构师 详情

【武汉】【奇虎360】招聘资深golang工程师 详情

 

一招教你用Go语言爬虫快速精准抓取拉勾职位!!!

文章分享有只黑白猫 发表了文章 • 2 个评论 • 494 次浏览 • 2020-01-09 16:51 • 来自相关话题

点击这里,查看源代码等关键重要内容拉 ...查看全部

点击这里,查看源代码等关键重要内容

拉勾

这里分析以拉勾网上的数据为准,通过使用Go语言编写一个拉勾网岗位的爬虫,抓取Go语言的所有岗位,来进行分析。正好我们也是找Go语言工作,顺便用Go语言练练手。

该爬虫比较简单,只需要根据拉勾网的搜索,然后一页页的爬取搜索结果,把结果整理成Excel输出即可。这里我们选取了岗位名称、工作地点、薪水以及招聘公司这几个元素进行爬取,收集这些信息进行分析。

本次分析,爬取了拉勾网上所有Go语言岗位,一共30页,450个岗位进行分析,所以结果也是很有代表性的。

工作地点

微信图片_20200109105450.jpg

从上图来看,450个Go语言的岗位,北京最多,占了186个,其次是上海83个,深圳52个,杭州31个,所以找Go语言的工作还是去北京、上海、深圳这些一线大城市,尤其是北京,一枝独秀,说明Go语言在北京的发展还是非常好的,学习和分享氛围也不错。

招聘公司

微信图片_20200109105457.jpg

该图表选择了一些招聘Go语言岗位多的公司进行分析,发现其中最多的是瓜子二手车,一个公司发布了19个Go语言开发的岗位,估计整个公司都快转Go语言了。

其次是滴滴公司,一共有13个在招聘Go语言的岗位,也是非常多了,看来滴滴对Go语言的推动力度很大。

除此之外,美团、百度、UCloud以及腾讯等公司都有3-5个Go语言的岗位在招聘,说明这些公司也陆陆续续开始用Go语言做一些适合的业务。

薪水分布

微信图片_20200109105503.jpg

薪水分布分析也过滤了分布比较少的区间,保留了主要的薪水区间。

从图表上看薪水开到15K-30K的Go语言岗位有71个,是岗位最多的薪水分布;其次是15K-25K的占51个;10K-20K的有49个。基本上一个Go语言开发都是上万。

此外,20K以上的Go语言岗位有89个,占总共450个岗位的近20%;25K以上的有31个,也占了总岗位的7%左右,比例也不算太低。

所以从这个看,Go语言做好了,20K以上也是非常轻松,最多可以开到50K。

经验要求

这个我保留了,没有分析,留给大家试试,看是1-3年的多,还是3-5年的多。

源代码

该代码只可用于学习研究之用,不可用于其他用途。

该爬取拉勾职位的Go语言爬虫,基于pholcus这个爬虫框架编写,是一个pholcus的爬取拉勾职位的规则库,大家使用的时候和正常的pholcus规则库是一样的,import导入引用即可。

关键字:数据采集 Go