js sdk 跨层穿透问题

关于js sdk的设计,这篇文档基本上详细介绍了很多的点,值得深入阅读一遍。https://github.com/hueitan/javascript-sdk-design 然而最近在重构某个js sdk时,也发现了一些问题,这个问题并不存在于上述文章中的。 js sdk在收到服务端的响应时,直接将server端返回的错误码给到用户。 这里会有一个问题,这个响应码,实际上是js sdk和server之间的消息交流。并不是js sdk和用户之间的消息交流。 如果我们将server端的响应直接返回给用户,则js sdk可以理解为是一个透明代理。用户将会和server端产生强耦合。如果server端有不兼容的变化,将会直接影响到用户的使用。 所以较好的做法是js sdk将这个错误封装为另一个种表现形式,和server端分离出来。

2021-08-12 13:46:39 · 1 min · Eddie Wang

面向异常编程todo

程序可能大部分时间都是按照正常的逻辑运行,然而也有少数的概率,程序发生异常。 优秀程序,不仅仅要考虑正常运行,还需要考虑两点: 如何处理异常 如何在发生异常后,快速定位原因 正常的处理如果称为收益的话,异常的处理就是要能够及时止损。 能稳定运行364天的程序,很可能因为一天的问题,就被客户抛弃。因为这一天的损失,就可能会超过之前收益的总和。 异常应当如何处理 如果事情有变坏的可能,不管这种可能性有多小,它总会发生。《莫非定律》 对于程序来说,避免变坏的方法只有一个,就是不要运行程序(纯粹废话😂)。 1. 及时崩溃 var conn = nil var maxConnectTimes = 3 var reconnectDelay = 3 * 1000 var currentReconnectTimes = 0 var timeId = 0 func InitDb () { conn = connect("数据库") conn.on("connected", ()=>{ // 将当前重连次数重制为0 currentReconnectTimes = 0 }) conn.on("error", ReconnectDb) } func ReconnectDb () { conn.Close() // 如果重连次数大于最大重连次数,将不在重连 if currentReconnecTimes > maxConnectTimes { return } // 如果已经催在重连的任务,则先关闭 if timeId != 0 { cleanTimeout(timeId) } // 当前重连次数增加 currentReconnectTimes++ // 开始延迟重连 timeId = setTimeout(InitDb, reconnectDelay) } 2....

2021-08-05 08:58:30 · 1 min · Eddie Wang

监控pod重启并写日志文件

一般来说,监控pod状态重启和告警,可以使用普罗米修斯或者kubewatch。 但是如果你只想将某个pod重启了,往某个日志文件中写一条记录,那么下面的方式将是非常简单的。 实现的思路是使用kubectl 获取所有pod的状态信息,统计发生过重启的pod, 然后和之前的重启次数做对比,如果比之前记录的次数大,那么肯定是发生过重启了。 #!/bin/bash now=$(date "+%Y-%m-%d %H:%M:%S") log_file="/var/log/pod.restart.log" ns="some-namespace" echo $now start pod restart monitor >> $log_file # touch一下之前的记录文件,防止文件不存在 touch restart.old.log # 生成本次的统计数据 kubectl get pod -n $ns -o wide | awk '$4 > 0{print $1,$4}' | grep -v NAME > restart.now.log # 按行读取本次统计数据 # 数据格式为:podname 重启次数 while read line do # pod name name=$(echo $line | awk '{print $1}') # 重启次数 count=$(echo $line | awk '{print $2}') # 检查本次重启的pod名称是否在之前的记录中存在 if grep $name restart....

2021-07-28 21:21:33 · 1 min · Eddie Wang

udp cluster 多进程调度策略学习

本来我的目的是使用cluster模块的fork出多个进程,让各个进程都能处理udp消息的。但是最终测试发现,实际上仅有一个进程处理了绝大数消息,其他的进程,要么不处理消息,要么处理的非常少的消息。 然而使用cluster来开启http服务的多进程,却能够达到多进程的负载。 server端demo代码: const cluster = require('cluster') const numCPUs = require('os').cpus().length const { logger } = require('./logger') const dgram = require('dgram') // const { createHTTPServer, createUDPServer } = require('./app') const port = 8088 if (cluster.isMaster) { for (let i = 0; i < numCPUs; i++) { cluster.fork() } cluster.on('exit', (worker, code, signal) => { logger.info(`工作进程 ${worker.process.pid} 已退出`) }) } else { const server = dgram.createSocket({ type: 'udp4', reuseAddr: true }) server....

2021-07-21 12:57:03 · 4 min · Eddie Wang

使用nginx为udp服务负载均衡

对nginx的最低版本要求是? 1.9.13 The ngx_stream_proxy_module module (1.9.0) allows proxying data streams over TCP, UDP (1.9.13), and UNIX-domain sockets. 简单的配置是什么样? 例如监听本地53的udp端口,然后转发到192.168.136.130和192.168.136.131的53端口 注意事项 stream是顶层的配置,不能包含在http模块里面 proxy_responses很重要,如果你的udp服务只接受udp消息,并不发送udp消息,那么务必将proxy_responses的值设置为0 stream { upstream dns_upstreams { server 192.168.136.130:53; server 192.168.136.131:53; } server { listen 53 udp; proxy_pass dns_upstreams; proxy_timeout 1s; proxy_responses 0; error_log logs/dns.log; } } | Syntax: | proxy_responses number; Default: — Context: stream, server | This directive appeared in version 1.9.13. Sets the number of datagrams expected from the proxied server in response to a client datagram if the UDP protocol is used....

2021-07-17 19:28:18 · 1 min · Eddie Wang

7月书单

6月书单回顾 《鳗鱼的旅行》刚读到92% 《Googler软件测试之道》100% 《软件测试之道微软技术专家经验总结》24% 《沉默的病人》100% 《一个人的朝圣》9% 《读懂发票》100% 《108个训练让你成为手机摄影达人》100% 《经济学通识课》5% 《楚留香新传》100% 7月书单 《鳗鱼的旅行》 《软件测试之道微软技术专家经验总结》 [KU]《一个人的朝圣》 [KU]《经济学通识课》 new 水浒传 [KU] new 围城 [KU] new 黄金时代 new 长安十二时辰 [KU] new 幻夜 new 软件开发本质论 [KU] new 苏东坡传 [KU] new 诡计博物馆 [KU] new 大师的盛宴 二十世纪最佳科幻小说 [KU] new 活出生命的意义

2021-07-08 12:34:59 · 1 min · Eddie Wang

Google软件测试之道(异步图书) James Whittaker; Jason Arbon; Jeff Carollo

Google软件测试之道(异步图书)James Whittaker; Jason Arbon; Jeff Carollo 序标注(黄色) - 位置 361从根本上说,如果测试人员想加入这个俱乐部,就必须具备良好的计算机科学基础和编程能力。变革标注(黄色) - 位置 367招聘具备开发能力的测试人员很难,找到懂测试的开发人员就更难,标注(黄色) - 位置 368但是维持现状更要命,我只能往前走。标注(黄色) - 位置 388我们寻找的人要兼具开发人员的技能和测试人员的思维,他们必须会编程,能实现工具、平台和测试自动化。第1章 Google软件测试介绍标注(黄色) - 1.1 质量不等于测试 > 位置 573Google能用如此少的专职测试人员的原因,就是开发对质量的负责。标注(黄色) - 1.1 质量不等于测试 > 位置 574如果某个产品出了问题,第一个跳出来的肯定是导致这个问题发生的开发人员,而不是遗漏这个 bug的测试人员。标注(黄色) - 1.2.1 软件开发工程师(SWE) > 位置 593软件开发工程师(标注(黄色) - 1.2.2 软件测试开发工程师(SET) > 位置 600软件测试开发工程师(标注(黄色) - 1.2.3 测试工程师(TE) > 位置 612TE把用户放在第一位来思考。 TE组织整体质量实践,分析解释测试运行结果,第2章 软件测试开发工程师书签 - 位置 784标注(黄色) - 位置 787Google的 SWE是功能开发人员; Google的 SET是测试开发人员; Google的 TE是用户开发人员。标注(黄色) - 2.1.1 开发和测试流程 > 位置 864测试驱动开发”标注(黄色) - 2....

2021-07-08 09:03:07 · 4 min · Eddie Wang

沉默的病人(世界狂销300万册的烧脑神作!多少看似完美的夫妻,都在等待杀死对方的契机)

沉默的病人(世界狂销300万册的烧脑神作!多少看似完美的夫妻,都在等待杀死对方的契机)亚历克斯·麦克利兹 第二部分 PAPT TWO标注(黄色) - 9 > 位置 1294选择自己所爱的人就像选择心理治疗师,”鲁思说,“我们有必要问自己,这个人会不会对我忠诚,能不能听得进批评,标注(黄色) - 9 > 位置 1295承认所犯的错误,而且做不到的事情决不承诺?”第三部分 PAPT THREE标注(黄色) - 位置 2577虽然我生来不是个好人,有时我却偶然要做个好人。——威廉·莎士比亚《冬天的故事》[

2021-07-08 08:58:49 · 1 min · Eddie Wang

被讨厌的勇气:“自我启发之父”阿德勒的哲学课

引言标注(黄色) - 位置 225人并不是住在客观的世界,而是住在自己营造的主观世界里。第一夜 我们的不幸是谁的错?标注(黄色) - 不为人知的心理学“第三巨头” > 位置 335但在世界上,阿德勒是与弗洛伊德、荣格并列的三大巨头之一。标注(黄色) - 再怎么“找原因”,也没法改变一个人 > 位置 377如果所有人的“现在”都由“过去”所决定,那岂不是很奇怪吗?标注(黄色) - 再怎么“找原因”,也没法改变一个人 > 位置 384您是说与过去没有关系?哲人:是的,这就是阿德勒心理学的立场。标注(黄色) - 再怎么“找原因”,也没法改变一个人 > 位置 389阿德勒心理学考虑的不是过去的“原因”,而是现在的“目的”。标注(黄色) - 心理创伤并不存在 > 位置 417任何经历本身并不是成功或者失败的原因。我们并非因为自身经历中的刺激——所谓的心理创伤——而痛苦,事实上我们会从经历中发现符合自己目的的因素。决定我们自身的不是过去的经历,而是我们自己赋予经历的意义。”标注(黄色) - 心理创伤并不存在 > 位置 423人生不是由别人赋予的,而是由自己选择的,是自己选择自己如何生活。标注(黄色) - 心理创伤并不存在 > 位置 443我们大家都是在为了某种“目的”而活着。这就是目的论。标注(黄色) - 你的不幸,皆是自己“选择”的 > 位置 599而是因为你认为“不幸”对你自身而言是一种“善”。标注(黄色) - 人们常常下定决心“不改变” > 位置 614某人如何看“世界”,又如何看“自己”,把这些“赋予意义的方式”汇集起来的概念就可以理解为生活方式。标注(黄色) - 你的人生取决于“当下” > 位置 706无论之前的人生发生过什么,都对今后的人生如何度过没有影响。”决定自己人生的是活在“此时此刻”的你自己。第二夜 一切烦恼都来自人际关系标注(黄色) - 为什么讨厌自己? > 位置 780阿德勒心理学把这叫作“鼓励”。青年:鼓励?书签 - 一切烦恼都是人际关系的烦恼 > 位置 834标注(黄色) - 自卑情结只是一种借口 > 位置 936自卑情结是指把自己的自卑感当作某种借口使用的状态。标注(黄色) - 自卑情结只是一种借口 > 位置 943外部因果律”一词来进行说明。意思就是:将原本没有任何因果关系的事情解释成似乎有重大因果关系一样。标注(黄色) - 人生不是与他人的比赛 > 位置 1044健全的自卑感不是来自与别人的比较,而是来自与“理想的自己”的比较。标注(黄色) - 在意你长相的,只有你自己 > 位置 1071在意你长相的,只有你自己标注(黄色) - 人生的三大课题:交友课题、工作课题以及爱的课题 > 位置 1223交友课题、工作课题以及爱的课题标注(黄色) - 人生的三大课题:交友课题、工作课题以及爱的课题 > 位置 1224一切烦恼皆源于人际关系”标注(黄色) - 浪漫的红线和坚固的锁链 > 位置 1313当人能够感觉到“与这个人在一起可以无拘无束”的时候,才能够体会到爱。既没有自卑感也不必炫耀优越性,能够保持一种平静而自然的状态。真正的爱应该是这样的。标注(黄色) - 浪漫的红线和坚固的锁链 > 位置 1315束缚是想要支配对方的表现,也是一种基于不信任感的想法。与一个不信任自己的人处在同一个空间里,那就根本不可能保持一种自然状态。标注(黄色) - “人生谎言”教我们学会逃避 > 位置 1333那并不是因为无法容忍 A的缺点才讨厌他,而是你先有“要讨厌 A”这个目的,之后才找出了符合这个目的的缺点。标注(黄色) - “人生谎言”教我们学会逃避 > 位置 1345人就是这么任性而自私的生物,一旦产生这种想法,无论怎样都能发现对方的缺点。标注(黄色) - 阿德勒心理学是“勇气的心理学” > 位置 1373青年:也就是“不在于被给予了什么,而在于如何去使用被给予的东西”那句话吗?第三夜 让干涉你生活的人见鬼去标注(黄色) - 自由就是不再寻求认可? > 位置 1405就是:“货币是被铸造的自由。”它是陀思妥耶夫斯基的小说中出现的一句话。“被铸造的自由”这种说法是何等的痛快啊!我认为这是一句非常精辟的话,它一语道破了货币的标注(黄色) - 自由就是不再寻求认可? > 位置 1449阿德勒心理学否定寻求他人的认可。标注(黄色) - 要不要活在别人的期待中? > 位置 1479在犹太教教义中有这么一句话:“倘若自己都不为自己活出自己的人生,那还有谁会为自己而活呢?”你就活在自己的人生中。书签 - 要不要活在别人的期待中? > 位置 1498标注(黄色) - 砍断“格尔迪奥斯绳结” > 位置 1689否定原因论、否定精神创伤、采取目的论;认为人的烦恼全都是关于人际关系的烦恼;此外,不寻求认可或者课题分离也全都是反常识的理论。标注(黄色) - 自由就是被别人讨厌 > 位置 1764自由就是被别人讨厌”。标注(黄色) - 自由就是被别人讨厌 > 位置 1785不畏惧被人讨厌而是勇往直前,不随波逐流而是激流勇进,这才是对人而言的自由。第五夜 认真的人生“活在当下”标注(黄色) - 对决“人生最大的谎言” > 位置 2910人生中最大的谎言就是不活在“此时此刻”。纠结过去、关注未来,把微弱而模糊的光打向人生整体,自认为看到了些什么。标注(黄色) - 对决“人生最大的谎言” > 位置 2916因为过去和未来根本不存在,所以才要谈现在。起决定作用的既不是昨天也不是明天,而是“此时此刻”。标注(黄色) - 人生的意义,由你自己决定 > 位置 2982必须有人开始。即使别人不合作,那也与你无关。我的意见就是这样。应该由你开始,不用去考虑别人是否合作。”后记标注(黄色) - 位置 3011一切烦恼皆源于人际关系”“人可以随时改变并能够获得幸福”“问题不在于能力而在于勇气

2021-06-16 13:47:30 · 1 min · Eddie Wang

windows版本nc教程:在windows上做udp测试

有时候,客户端的udp包被中间的防火墙拦截了,在linux上可以很简单的用nc启动一个udp server # 启动udp server 监听8888端口 nc -ulp 20000 # 启动udp client nc -u 127.0.0.1 20000 在linux上启动nc udp server很简单,但是在windows上,没办法安装nc啊?😭 峰回路转 https://nmap.org/download.html 在查看了nc的官网之后,发现nc实际上也提供了windows的程序,有两种版本。 有GUI界面的,使用友好,安装包比较大 https://nmap.org/dist/nmap-7.91-setup.exe 仅仅在命令行下执行,刚好满足需求 https://nmap.org/dist/nmap-7.91-win32.zip 看看带GUI界面的 附件 nmap-7.91-win32.zip

2021-06-16 13:31:13 · 1 min · Eddie Wang