我曾经写了一篇跳出Go module的泥潭, 记录了使用go module的一些坑,随着Go 1.13版本的发布,go module的功能再不断的演化(或者不委婉的说在不断的修补),go module很多功能也发生了变化,这篇文章记录了新版本(go 1.13)下module的使用方法。
Rust每周一库: lazy_static
八月中秋白露,路上行人凄凉。小桥明月桂花香,日夜千思万想。 心中万般宁静,青春好读文章。 十年苦读在书房,方见才学益广。
辛弃疾《西江月·夜行黄沙道中》
lazy_static 是rust中广泛使用的一个库,一直处于“Most Downloaded”下载列表的前十中,每天的下载量也是上万次。
它使用简单,切换方便,功能专一,同时支持std
和no-std
,也是一个我们学习rust开发的很好的例子。
lazy_static
可以帮助你实现延迟初始化static
常量的功能。
Go内存泄漏?不是那么简单!
最近遇到一个Go内存不释放的问题,记录一下测试和调研的情况。我到不把它归为Go内存泄漏的问题,因为它和一般的内存泄漏的方式不同。
明白了,原来Go web框架中的中间件都是这样实现的
这篇文章想谈谈Go的装饰器模式、pipeline(filter)模式以及常见web框架中的中间件的实现方式。
Hi, 使用多年的go pprof检查内存泄漏的方法居然是错的?!
最近在做一个 Redis 的 Proxy 的项目,其中利用Redis 6.0 新加的 tracking 功能实现客户端缓存的功能,可以为某些特定的redis使用场景提高吞吐和延迟。
当然,cache的实现也是有代价的。首先,cache的大小不能无限制的大,否则总有一点会把内存撑爆的;其次,cache的淘汰算法有多种方式,LRU、LFU等等,具体可以参考Cache replacement policies,不同的场景下各种淘汰算法的效果是不一样的;第三,对于大并发情况实现cache是有代价的,因为并发情况下对cache的访问需要加锁,而加锁就意味着有性能的损失。
我在实现这个cache的过程中稍微偷了一下懒, 想尽量的减少锁的scope,结果导致内存泄漏的问题。本来cache占用的最大内存我设置为10GB, 结果过了个周末发现程序已经占用了80GB的内存了。
当然本文不是要介绍这个项目的内存泄漏原因,而是介绍一下Go pprof工具查找内存泄漏的一个不太常用的方法。
[译]Rust返回引用的不同策略
原文: Strategies for Returning References in Rust by Bryce Fisher-Fleig.
译者按: 这是 Fisher-Fleig 整理一篇关于从函数/方法中返回引用值的知识。
很显然,对于Rust初学者来说,很容易陷入无法返回函数内的本地变量的泥沼里,尤其是从其它编程语言如Java、Go转过来的程序员,在其它编程语言中很容易的编程方式却在Rust编程语言中行不通。这篇文章可以帮助你理解返回引用的各种方法,包括网友也提供的一些方法。
这次我会演示我在编程中经常和Borrow Checker
有冲突的一些场景,提供一些修改代码以便成功编译的编程模式。
假定我们使用一个数据库连接池去连接一个假想的Postgres数据库。这个假想的库的API需要我们首先使用一个字符串初始化一个连接池。一旦连接池初始化成功,我们就可以调用它的connect
方法得到一个可用的拥有所用权的链接对象进行查询。
用最简单的方式实现 Rust RPC 服务
RPC是对进程内函数调用的分布式开展,它将进程内的函数调用,扩展成对远程机器上的相应的函数的调用。如何使用最少的代码,用最容易的方式调用远程函数呢?
首先需要知道远程机器的IP地址和端口,然后呢,使用原先进程内的方式直接调用即可,这是最容易的RPC调用。容易不意味着功能简单,而是rpc库背后默默为你承担了序列化、网络传输、路由、服务调用、服务治理的功能。
rpcx秉承 Go 标准库简单而强大的设计理念,为 Rust 提供了一个原生的 rpc 库。
为什么说是原生呢?因为你可以使用任何你熟悉的编程语言通过HTTP或者JSON-RPC2.0的方式访问Go或者Java实现的rpcx服务,但是除了Go/Java编程语言你没有办法使用raw的rpcx protocol实现TCP的网络调用,而基于TCP的RPC性能要远远高于Request-Response这种类HTTP的调用模型。
现在rpcx for rust的库也发布了: rpcx-rs。 你可以使用它原生的访问Go或者Java实现的rpcx服务,也可以使用Rust提供rpcx服务。
关键是,依然是那么的简单。