开云体育

ctrl + shift + ? for shortcuts
© 2025 开云体育

(20201212) Hot Posts


 

开云体育

2020-12-12 Hot Posts

?

Hacker News

Poll: Will you take the Covid vaccine?

V2EX


本人也是计算机爱好者,学的不咋样,发现自己总是跨越不了写代码编程这个门槛,及时转行找了固定工作。但是还是对编程这个行业感兴趣。现在岁数大了更学不了了,下决心学几次编程,基本都是到了循环就放弃了。
想问下各位程序员攻城狮们,这个行业从年轻时入职写代码,岁数大了是都转行去当经理了么?有人写到退休么?纯属个人疑问啊,之前也问过工作中接触到的公司的人,但都是说先干着呗,以后再说。

今年五月份买了一辆二手车。第一次开。至今开了 4000km+,也算是脱离新手了。
今天早上七点多出门,第一次遇到大雾天,能见度 25-30m,小心翼翼的。上高架,然后就刷新我的认知了。
99%的人开双闪。只有 1%开雾灯+双闪。这个数字不夸张,十个人里面有一个开就不错了。还遇到一两个人不开灯乱窜的。。。。
从高架上到高架下,看到的车起码有 100 辆+,开雾灯的绝对用两个手能数的过来。

已加入

RPC 的变革 —— ARPC 项目自荐

项目地址:

一、ARPC 示例

echo server

package main

import (
	"log"

	"github.com/lesismal/arpc"
)

func onEcho(ctx *arpc.Context) {
	str := ""
	err := ctx.Bind(&str)
	if err != nil {
		log.Printf("/echo error: %v", err)
		return
	}
	ctx.Write(str)
	log.Printf("/echo: %v", str)
}

func main() {
	svr := arpc.NewServer()

	// register handler
	svr.Handler.Handle("/echo", onEcho)

	svr.Run(":8888")
}

echo client

package main

import (
	"context"
	"log"
	"net"
	"time"

	"github.com/lesismal/arpc"
)

func dialer() (net.Conn, error) {
	return net.DialTimeout("tcp", "localhost:8888", time.Second*3)
}

func main() {
	client, err := arpc.NewClient(dialer)
	if err != nil {
		log.Fatalf("NewClient failed: %v", err)
	}
	defer client.Stop()

	request := "hello"
	response := ""
	// err = client.Call("/echo", &request, &response, time.Second*5)
	err = client.CallWith(context.Background(), "/echo", &request, &response)
	if err != nil {
		log.Fatalf("Call /echo failed: %v", err)
	} else {
		log.Printf("Call /echo Response: \"%v\"", response)
	}
}

二、传统主流的 RPC 框架的局限 /不爽

1. 网络交互模式单一,无法支持更丰富的场景

传统主流 RPC 的网络交互主要是 摆客户端到服务端,请求-应答闭 的模式,比较单一。按照这个模式以及顾名思义“远程过程调用”,其实 HTTP 也算是 RPC 的一种,只是由于其短连接和 HTTP 协议的文本编码格式等原因导致性能和资源的浪费,所以很少有直接把 HTTP 称为 RPC

网络通信的本质是数据收发,客户端和服务端都可以随时主动发送消息给对方,比如推送服务IM游戏等;而且一方发送数据给另一方,有时是不需要回复的,比如VOIP 电话,其他不要求强一致的消息广播、推送等。

这里把需要应答的通信定义为 Call ,不需要应答的通信定义为 Notify,则网络交互按照发起方、是否需要应答,可以分为以下四种基本模式:

1 )客户端发起请求,服务端应答

2 )服务端发起请求,客户端应答

3 )客户端向服务端发出通知 /推送,无需应答

4 )客户端向服务端发出通知 /推送,无需应答

如此看来,传统主流 RPC 就像是个大内男公务员,因为它只支持了第一种基本模式,只覆盖了 25%——甚至说它的网络通讯模式有点不完整,都算是一种褒奖,因为 25%的模式支持那是相当不完整。

而只支持请求-应答的模式也限制了很多业务场景,其他更广泛的业务场景比如推送服务IM游戏,我们还需要自定义各种协议。

2. Server 端函数调用的写法,函数返回即是调用结束,不够灵活

传统主流 RPC 服务端的写法通常是一个函数,函数返回后框架层把返回值打包发送给客户端作为应答,不支持在该函数中进行异步响应,尤其是 golang 的 RPC ,有的框架为了代码简单,没有写协程,发送数据时直接写到 Conn,高并发写时竞争比较明显会增加时延;有的框架默认采用读协程收到数据 one-by-one 的方式处理,存在线头阻塞的问题,有的框架采用每个消息新开一个 go 协程处理,高并发时协程数量可能暴增、比较浪费,不支持按单个 Method/Router 定制同步或者异步处理,也不支持在 Method/Router handler 内由业务层自主选择同步处理、新开 go 协程异步或者协程池等异步等方式的处理。

三、对于 ARPC

1. 高性能

想说 ARPC 比其他流行的 golang RPC 性能都好,但是自吹最强好像没有说服力,感谢 有做一些主流 RPC 框架的性能对比, 已经废弃并且那时 ARPC 还没有出生,有兴趣的同学可以到 跑下代码进行对比,测试时请注意排除其他程序的干扰。

目前最为主流的 gRPC 因为官方综合考量使用了 HTTP2 ,详情参考 ,注定了不能很高性能。而很多 RPC 的业务场景,是基于内部服务集群, HTTP2 的加密流程等显得有些性能浪费。而 ARPC 更注重性能和灵活性,通信协议部分交由业务层决定,通常建议使用 TCP 作为基础通信协议,如有需要,业务层也可以使用 TLSWebsocket 或者 KCP 等 。

2. 网络交互模式全面

上面在 不爽 的部分提到了传统主流 RPC 的不完整, ARPC 当然要比较全面的支持这四种基本交互模式:

1 )客户端发起请求,服务端应答

2 )服务端发起请求,客户端应答

3 )客户端向服务端发出通知 /推送,无需应答

4 )客户端向服务端发出通知 /推送,无需应答

3. 丰富的业务场景支持

由于网络交互模式相对全面,ARPC 可以用于处理多种常规业务场景而不受类似 HTTP 短链接、单向请求-应答方式的限制。比如:

1 )推送服务

2 )游戏服务

3 )聊天服务

4 )其他需要长连接、双向、广播等灵活交互方式的业务

4. 写法简单

如[示例](#rpc 进化--arpc-项目自荐)所示,Handler 不采用函数返回即调用结束的形式,写法简单、更像 HTTP Handler 。由于也不强制使用编解码器,甚至不必生成结构化消息或者服务如 Protobuf 的 Message 、Service 等,这样也带来一些额外的好处,比如热点的结构化数据,业务层可以在数据更新时序列化一次并缓存起来,有需要时直接发送序列化之后的数据给需求方,避免每次发送给每个连接都需要进行一次序列化的浪费,在高在线量的广播类业务中这点尤为明显。

其他一些 RPC 框架喜欢注册对象的方式,由框架层通过反射去解析符合 Handler 格式的方法进行隐式注册,由于早年被 C++的各种语言标准、机制等背后动作玩弄得辛苦,golang 项目中希望框架层和业务层都尽量不让用户增加没有必要的心智负担(比如通过对象隐式注册的方式:没有带来性能提升,没有架构设计模块设计的解耦或者其他优化), ARPC 的设计遵循简单、透明的原则,所以像 HTTP 一样进行显式注册,如果有的同行喜欢玩弄语法糖技巧或者被语法糖技巧玩弄,可以自行定制。

5. 更灵活的同步异步

支持单个 Method/Router Handler 级别设置同步或者异步处理,也支持 Handler 内由业务层自主控制同步或异步回包、从而针对性定制快 /慢接口的协程数量控制与线头阻塞问题处理。

6. 最少依赖

目前如果只使用 ARPC 默认参数,则只使用了 golang 标准库,不需要依赖其他第三方 package 。

7. 易扩展

1 )网络协议支持:由用户自主决定,服务端实现 net.Listener 、客户端实现 net.Conn 即可做为 ARPC 的网络载体, 已经提供了 KCPQUICTLSUnixSocketUTPWebsocket 等示例,欢迎参考。

2 )非结构化的消息体编解码支持:可以直接用 string 、 *string 、 []byte 、 *[]byte 、error 、 *error 等作为消息体参数。

3 )结构化的消息体编解码支持:为了最少依赖, ARPC 默认使用了 encoding/json 作为结构化消息体的编解码器,性能不够强,但是业务层可以很方便地设置使用 json-iter 、Protobuf 等作为结构化消息地编解码器。

4 )消息体编解码中间件支持: ARPC 提供了消息体编解码中间件机制, 子包实现了 、 作为默认示例,有需要的用户可以参考实现自行定制,使用示例在 。

5 ) Method/Router 的中间件支持: ARPC 提供了类似流行的 golang HTTP 框架的中间件,方便业务层自行扩展, 子包实现了 LoggerRecoverGraceful 作为默认示例,有需要的用户可以参考并实现自行定制,使用示例在

6 ) Web JS Client 支持: ARPC 提供了 及示例: 、 。有了 JS Client, 不需要类似其他 RPC 框架那样部署 HTTP 转换 RPC 的网关,前端可以直接通过 WebsocketARPC 服务进行交互,而且因为 ARPC 已经包括了消息的编解码、Method/Router Handler,比 melody 等只封装了收发数据的基础 websocket 框架更方便。

其他扩展不一一列举了,欢迎有兴趣的同学查看代码或者 New issue 。

8. 更多示例

提供了较为丰富的示例,如 通知广播优雅退出服务注册与发现连接池kcp/quic/tls/websocket 等协议支持发布订阅JS Web Chat 等,请见 。

9. 其他

个人精力有限,并且 golang 是世界上第二好的编程语言,所以暂时不考虑对其他语言的支持,欢迎 pr 、issue 。


非运维,看到公司几十台服务器全是 Ubuntu 20.04 LTS (几年前好像是 RHEL ),几年了没因为系统问题崩过一次,是否可以说明 Ubuntu 也适合用于生产环境服务器?总是能在网络上看到 Ubuntu 不适合用于服务器的言论。


最近天天加班,周末还得陪女朋友,都没时间给自己充电了。

买的腾讯课堂算是白费了,只能等有时间再去看了

类似技术

  • graphql
  • Tencent / APIJSON
  • grpc

虽说以上技术都不是真的实际操作数据库,但是如果真的可以直接操作数据库并且解决了安全问题, 是否还需要后端工程师。


一直以来登录某宝的时候都是用的密码自动输入,今天缓了一下,突然发现登录页面不太对劲,登录的位置长这个样子:

img1

隐约发现下面还有一层东西,还有一个登录按钮,当时第一反应是,莫不是我遇上了盗号木马?这玩意创建了一个伪造的登录表格让我输入账号密码?

登录很快就完成了,根本没来得及让我截图。

于是我又退出登录,反复刷新了好几次页面,又遇见了。

这木马还挺智能啊,知道反侦察词

为了确保不是浏览器被注入了,我又打开了虚拟机,用里面的浏览器反复刷新这个页面,又复现了。

刚刚已经登录成功了,那我的账号信息岂不是已经泄露了?

然而,当我分析页面代码的时候,发现了这个,登录框后面是这个东西:

img2

……

某宝的美工你是认真的吗?……

完整的图片地址是这样:

https://img.alicdn.com/tfs/TB1A9Ek38r0gK0jSZFnXXbRRXXa-2500-600.jpg

把这图传到图床以防消失:


又:

突然又多了一个想法,要是一个木马先伪造登录框,获得密码之后立刻销毁证据,又用这种图片把内容替换掉,伪装成“啊,这只是一个失误”,似乎也没办法证伪吧?

……

我的被迫害妄想症又一次加重了……?

另外真是无力吐槽,一直给我推荐女装,我买的哪样东西让某宝产生了错觉我需要女装?


会不会拿到瑕疵的机器或者是别人开过盒的机器啊


前两天试了一下 google stadia 由于区域限制只能勉强用美国 ip 玩 基本上属于没法玩 (主要是我美国线路不太好) 非常不推荐 游戏要 60 刀 只能在 stadia 玩

今天试了一下 GeForce NOW 用香港的线路就很快乐 可以用自己的 steam 账号 以后没准有了 pc 也能用

延迟和画质都不错 由于是云游戏可以画质光追啥的都开最高 实际画质只取决于自己的网络环境

总之可以玩的很爽就对了


这两天反复的为住处的网络问题折腾,之前以为是 ipv6 线路问题,等把 ipv6 停掉了,才发现原来我们这本地运营商的 ipv4 DNS,也开始投毒,具体的讲就是某些域名它给你返回 127.0.0.1 。。。这还不是什么特殊网站,只是微软家的一个短地址解析服务,导致 VS 不能更新,给工作带来了极大困扰。

不得已我终于开始上诸如 simple-dnscrypt 这样的 DNS 解析软件,但是我发现上了这类软件后产生了新的问题,首先就是这类软件为了保证效果,是要求你的 DNS 解析都从它这里走,也就是说,适配器里自定义 DNS 必须是 127.0.0.1 。这确实有效的对抗了 DNS 干扰,但是带来一个副作用就是访问网站(尤其是国内网站)的响应和加载速度大大降低。因为以前这些国内网站走运营商 DNS 查询速度是很快的,而现在走 simple-dnscrypt 的话,查询 dns 的结果的延迟可以达到秒级别;还有一个完全没法忍的问题是,走 simple-dnscrypt 的话,国内很多网站的 CDN 加速,就工作不正常了,可以明显的看到浏览器不是访问的最快的 CDN 服务,就导致这类网站的静态资源加载速度比用运营商 DNS 时慢的不止一点。放狗查了一下发现还真有描述这个现象的文章:叫使用公共 DNS 必须付出的代价之一,就是这个 CDN 失效问题,因为公共 DNS 不一定能让 CDN 识别你的请求来源。

我该咋办了呢?是不是我的使用姿势不太对。感觉这年头上个网还真折腾。

突发奇想地想到 v 站平时使用体验也还挺好的,后台使用了多少台服务器呢?
搜索了下,也没有找到相关内容,特发此主题求教词词


事情是这样的,去年首发买了 iphone 11 pro max 的绿色 256G,当时自己刚留学在美国,官网下单的时候看到 apple care +的选项里包括遗失和被偷窃的保险。于是也就买了一个。风平浪静一年过后,今年年底 12 发售了,等了一个月,等到 12 pro max 可以预定,于是想着要不要以旧换新买一个。遂在手机设置寻找怎么能关闭 apple care +。于是,我的脑残操作开始了。

在手机的 apple care 设置里面我瞬间就被那个我都忘记了的丢失失窃保险选项吸引了,于是手贱点了一下,在等待加载的时候,觉得好像不应该点进来,于是切了出去(此处划重点),之后仍然翻了一阵子设置,没有找到如何暂停的我关掉了手机屏幕准备在网页上找客服,没想到就发现手机已经开始进入 apple logo 下的进度条状态。同时我接到了 apple 发来的手机丢失的邮件,告诉我数据已经被擦除了。于是,我找客服的目的就变了。

我按照邮件的提示链接进入了一个保险公司的页面,上面还有我的案例编号。我通过编号检索不到我的记录。客服回复说可能需要几个小时才能查询,问我是否有其他需求。我说我想关闭 apple care,客服顺利帮我关掉了(划重点再一次),这时候我才注意到手机无法开机激活了,提示要联系客服。客服和我说,等等,最多两小时就好了。

心大的我等了两小时,仍旧不能激活。于是联系客服,发现客服下班了。于是打国际长途给国内的苹果客服。客服耐心的帮我尝试了各种办法解锁,费时两小时无果,让我提交发票等材料证明是我的手机。可挂掉电话我发现丫的美国人不讲武德,哪里有发票!只能提交相关邮件和订单截图。一天后,我接到了上海的电话,告诉我,解不开。。。。。

这期间我等到了美国客服的上班,然而报了案例号之后,客服说,这里面咋都是中文的对话呢,不行,你得重新和我描述。在我废了一堆口舌之后,他让我自己联系保险公司。而实际情况是,保险公司发来的邮件所提供的案例编号根本查不到。于是只得打保险公司电话,在漫长等待后保险公司客服说,我们问问苹果去,这样,皮球又踢给了苹果。我们用保险公司的线路又和苹果的一个新客服从头聊了起来。

期间客服一直让我在查找我的设备中删掉我的这台 iphone,但是,我就是删不掉,苹果表示不信,不同的客服在不同的日子反复控制的我各种设备,围观我删这个 iphone 在我的账户中,怎奈就是删不掉。

这样扯皮了叁天。手机仍然无法激活。但最终,一个不知道转了多少次的好高级的客服代表告诉了我为何有如此棘手的状况:
1,你点开了保险公司的报失流程,但是还没加载你就退出了,导致报失程序悬停在了空中,保险公司和 apple 都没收到,却又实际的生成了一个不存在的案例编号。如果我等到加载出具体页面再点击结束报失也不至于此。
2,我成功取消了的 apple care,如果我没有取消,大可以通过 apple care 的流程关闭这个报失,但是我把后路切断了,apple care 已经续不上了。
3 我只能等待保险公司定期的案例清理,这个不能人工干预,是周期性的,却没法告诉我具体日期以及成功率。
4,谢谢我帮助 apple 找到了一个流程漏洞

最后手机在后来不知多久后的一天,我一次开机中发现已经能解锁了。但是具体什么时候好的我却忘记了,最终还是买了 iphone 12.而这个 iphone11 让我在两周前以旧换新了一个 m1 的 mac mini 。而那就是另外的故事了。

这个故事给我的教训就是,不要手贱!
?