自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

沙沙罗曼的专栏

写点技术,聊聊生活

  • 博客(61)
  • 资源 (1)
  • 收藏
  • 关注

原创 OpenResty

最近笔者写了两篇在OpenResty上进行插件开发的文章,但可能忽略了一个关键点,即读者也许不知道OpenResty是什么,能做什么,因此对于怎么做并不感兴趣。本文尝试从是什么、能做什么、怎么做三个角度对OpenResty进行更详细的说明,争取让读者理解并对OpenResty有兴趣。Nginx & LuaNginxOpenResty最精简的描述是等于Nginx + Lua。Nginx是HTTP反向代理杰出的代表、最佳实践,主要可完成如下工作:静态资源代理请求转发,按一定路由规则转

2021-09-02 20:32:04 1012

原创 OpenResty服务发现

从Nginx加虚拟机部署后端服务转向使用Docker部署时,Nginx配置转发可能面临一个问题:“每次运行的Docker容器的IP不固定,应如何配置Upstream让流量正确转发”。低成本的方式一般是使用docker run -p ip:hostPort:containerPort将容器端口映射到虚拟机,这样Upstream的配置几乎不变。本文这次主要介绍另一种方式:“OpenResty基于服务发现的动态Upstream”,相比较端口映射方式在可靠性与灵活性上有所提升。交互图应用节点通过向Redis

2021-08-22 17:01:22 548 1

原创 OpenResty限频限流

OpenResty限频限流之前对系统限流这个话题有过一次讨论,之后有在实际工作中遇到一次应用,写一篇文章记录本次实践。背景目前在做的系统有提供Open API接入,即客户通过API Key接入使用系统功能。所允许接入的API根据功能种类不同所需系统开销有所差异,从技术角度希望对系统增加一些保护措施,避免用户接入使用过程有意或无意高频调用一些API对系统构成压力,从而影响整个系统稳定性。限制主要考虑两个维度:限频,限制单位时间内调用次数,关注调用速度限流,限制时间窗口内调用次数,关注调用总量

2021-08-01 16:45:30 850

原创 Node.js之class vs module

Node.js之class vs moduleclass是面向对象编程中的重要概念,它强大到大家没有任何可以吐槽它的角度,但本文还是想针对Node.js对class与module做个对比,然后结合实际俩聊自己的思考。class通过对相似事物的共性进行抽象,从而得到class,在所有面向对象编程语言中,最重要也最有用的两个特性是:继承与多态,如果没有这两个特性面向对象必将黯然失色,用作者的理解...

2019-07-14 23:47:03 1010

原创 系统限流

系统限流最近在系统中对一个资源访问做了限流,写篇文章聊聊这个话题。为什么要限流在衡量Web系统性能的指标中,最重要的参数是极限QPS,它表示系统每秒最多能够处理的Query数。从定义中可以知道QPS是一个描述系统处理速度的指标,当存在需要处理的流量(Query数)使得系统即使以极限QPS处理也无法在短时间内处理完所有流量,则称这个段时间内系统处于承压状态。当系统处于承压状态,容易理解超出系...

2019-05-05 21:54:56 769

原创 利用Redis实现排队需求

利用Redis实现排队需求近期在项目中做了一个用户排队等待接入客服的需求,此文记录自己的实现思路与过程,以及一些考虑的异常。需求大部分人都有排队等待接入客服的经历,所以需求不难理解:“存在一个在线客服列表,用户发起接入请求时,从客服列表中选择空闲的进行配对接入,如果没有可用客服则用户进入等待队列,每当出现客服空闲时接入等待队列中的第一个用户”。设计这部分主要描述自己从需求中理解的实体与关...

2019-03-23 16:34:21 6827 3

原创 排序算法

排序算法直接插入排序直接插入排序的思路是遍历过程中保持被遍历过的元素有序,每遍历到一个新元素时如不能保持已遍历元素有序,则为该新元素寻找合适的插入位置插入以保持遍历元素的有序性,当完成遍历时所有元素均有序。假设初始列表items = [4, 2, 3, 1, 5],非降序的直接插入排序过程如下:初始已遍历内容为[4],从i = 1开始,items[i = 1] = 2,[4] =&gt...

2019-03-09 21:19:10 121

原创 数据结构-二叉树

数据结构-二叉树树树的定义树是n个结点的有限集合,在一个非空的树中有且只有一个根结点,其余结点可分为m个互不相交的有限子集,其中每个子集又是一棵树,并且成为根节点的子树。文字定义有点绕,但图形化很容易记住: |----------A----------| | | | |---B---| C |-...

2019-03-04 22:09:04 251

原创 小程序-Canvas绘制折线图

小程序-Canvas绘制折线图自己在一个小程序项目中,希望通过绘制折线图展示不同时间的数值变化趋势,搜索了一番后没找到特别好的第三方库,故打算自己实现一个简单的绘制折线图方法,本文记录自己如何在小程序中通过canvas绘制折线图。目标最终目标是达到官方小程序数据助手中折线图的效果:除了UI目标外,还要便于在小程序其他地方使用或者在其他小程序中使用,所以API要有适当的通用性。实现实现...

2019-02-27 15:17:02 4026 3

原创 WebSocket备忘

WebSocket备忘记些websocket的知识备忘。对比HTTP优势websocket与HTTP一样,都是建立TCP之上的应用层协议,它较于HTTP的优点主要有以下两点:全双工HTTP不允许服务端主动向client发送数据,websocket在设计之初着重考虑了这个问题,所以websocket支持全双工通信,服务端可以主动给客户端推送消息传输更有效率HTTP经常需...

2019-02-24 00:12:27 120

原创 Node.js Event Loop备忘

Node.js Event Loop备忘Event Loop阶段描述图 ┌───────────────────────────┐┌─>│ timers ││ └─────────────┬─────────────┘│ ┌─────────────┴─────────────┐│ │ pending callbacks ...

2019-02-21 15:40:12 117

原创 实现文本diff比较与展示

实现文本diff比较与展示作为编程人员,文本diff比较与展示应该不陌生,最常见的是在Git中使用git diff命令,可以查看代码修改前后的对比。在git中diff比较与展示的最小单位是行,因为代码修改涉及的改动一般较多,以行为单位显示出来的效果,美观且容易阅读。自己最近在某个项目中遇到与一个git diff类似的需求:“一段普通长度的文本经过修改后,希望向阅读者展示修改所带来的前后差异”,...

2019-01-17 15:58:39 3349

原创 利用Redis实现分布式锁

利用Redis实现分布式锁在之前的答题对战项目中,游戏规则是根据双方回答同一道题所花时间长短判胜负,但测试过程中遇到一个偶现BUG:“对战开始后双方收到的题目不一致”,经过分析代码,发现问题原因在于发题逻辑没有加锁,所以写篇文章聊聊这个话题。什么是锁在编程领域,锁是一种用来做独占代码执行的方式,通俗来讲就是在打算做某件事情之前要申请许可证,如果没有得到许可证则无法做这件事。需要许可证的原因是...

2018-12-17 20:51:22 465

原创 实简单现websocket信道服务

实简单现websocket信道服务开端之前有为一个项目做顾问工作,帮助解决了几个问题。该项目完全按照wafer解决方案做的,我在解决问题过程中,发现wafer信道容易出现消息丢失情况,当时由于金主预算有限,没有从根本上解决这个问题,只是做了些曲线救国的优化,然后继续将就着用。与此同时腾讯官方表态wafer整套解决方案都不再提倡,同时不再维护,希望开发者往小程序“云开发”的方向靠拢。直到有一天...

2018-12-05 11:15:07 786

原创 docker学习之杂谈

docker学习之杂谈docker,离我第一次“近距离”接触已过去两年有余,这次为追赶潮流再次学习一番,此文记录自己对docker的一些认识和见解。我对docker的认识docker,本质上我认为是一个虚拟化技术,与虚拟机类似,虚拟机可以在宿主机上模拟完整的硬件环境,从而可以独立安装操作系统,docker则是在宿主机上模拟一个完整软件环境,从而达到独立运行应用程序的目的。这种模拟完整软件环境...

2018-10-17 11:31:46 167

原创 wafer信道的不可靠性

wafer信道的不可靠性wafer - 企业级微信小程序全栈方案近期帮他人处理了一个与wafer信道有关的技术问题,通过了解wafer信道相关内容,自己也对websocket也多了些认识,本文捋一捋自己这次经历以及收获。问题场景一个双人问答对战的小程序,多轮对战的过程中某一方可能出现卡住的情况,由于是第一次接触这个项目,花了些时间摸清技术大概:小程序使用一个叫wafer的腾讯云SDK做...

2018-10-11 17:20:21 786

原创 Linux的知识备忘

Linux的知识备忘最近在复习Linux的基础知识,这篇文章纪录一些我认为较有用的小知识点,相互之间没有必然联系。目录目录说明/根目录,万物起源/bin系统启动和运行所必须的二进制程序/bootLinux内核和启动加载程序/dev设备结点的特殊目录/etc这个目录包含所有系统层面的配置文件/home在通常的配置环境下,系统会在/h...

2018-10-11 11:14:17 122

原创 InnoDB Gap锁

InnoDB Gap锁这篇文章基于大家对于数据库事务隔离级别以及数据库锁有一定的认识,然后讲一讲InnoDB的Gap锁。事务隔离级别数据库的事务隔离级别主要用于定义并发事务之间的相互影响,比如如A事务将一条数据的id由2修改为3但未提交,这时B事务查询该条数据,id是2还是3?事务A提交后呢?造成这种差异的原因就是事务隔离级别,具体分为以下几种:未提交读(Read Unc...

2018-08-24 17:58:37 1502

原创 session、token与jwt

session、token与jwt自认为对session、token与jwt理解还可以,这次来讲讲这个话题。session与cookie什么是sessionsession翻译过来是会话,但在WEB领域常常是指会话数据:“同一客户端与服务端进行沟通时的上下文信息”,session的作用,我用一个例子来做比喻: 假设我在滴滴平台上叫车被司机拒载后,拨通了滴滴客服电话进行...

2018-08-21 17:05:33 3856 3

原创 使用子进程方式避免sharp rss占用过大

使用子进程方式避免sharp rss占用过大前些日子写了一篇文章-记一次内存泄漏处理,曲折过后发现并不是内存泄漏问题,而是rss占用过大,这篇文章讲述自己解决这个rss占用过大问题的一种方式:子进程调用。前情回顾应用中有一个服务端合成海报图片的功能,这个功能借助第三方库sharp实现,在应用运行一段时间后发现内存占用在500M以上,最初当成内存泄漏定位并在mac下重现了内存泄漏现象...

2018-08-14 16:58:04 553

原创 Node.js + InfluxDB实现APM

Node.js + InfluxDB实现APM应用性能监控,简称APM(Application Performance Management),它可以让我们随时快速的了解应用所处的状态,以及提供预警等功能。之前只知道有这么个东西但没有接触过,经验基本为零,最近由于业务发展良好并且自己也有兴趣,就赶鸭子上架去试着给系统加一个监控,帮助自己随时了解应用状况。Metrics做调研的前期接...

2018-08-07 18:47:53 1114

原创 记一次内存泄漏处理

记一次内存泄漏处理近期在检查服务器状态时,发现每个Node.js进程占用的内存大小在400-500M之间,根据平时的经验判断是代码中出现了内存泄漏导致,本文就记录这次内存泄漏问题的处理过程。定位内存泄漏原因过程没有用到什么高难度技术,只是靠经验凭感觉找到的问题代码,简言之就是应用中有一个合成朋友圈分享海报功能,考虑前端canvas兼容性不够好以及该功能使用频次低,所以采用的是服务端合成,就...

2018-08-01 11:55:25 1136

原创 记一次WEB服务器性能优化

记一次WEB服务器性能优化上个周末,自己做的一个业务后端,因为流量“过大”导致大部分请求在正常时间内都无法完成响应,故障持续了1个小时,中途只能调低nginx的连接上限,让部分人能够访问。这个业务后端上线一个多月,那一天的流量大约占之前所有流量的1/3,而且集中在那么几个小时内,QPS压力应该是平时的几十倍,所以没抗住…不管怎样,这是自己的锅,在实现这个业务后端的时候没有谨慎的考虑性能...

2018-07-22 12:29:17 914

原创 二次学习动态规划

二次学习动态规划最近在看一本经典的程序员书籍:《编程之美》,里面有一道买书的算法题,书中指导使用动态规划去解决该问题,虽然一年前有那么几天看似深入的学习了一下动态规划,但这次看完书上的解释之后还是不太清楚如何写代码去解决买书问题,所以用文章的方式再次记录一遍自己学习动态规划与解决买书问题的过程。动态规划动态规划是通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法,前面这句解...

2018-07-11 17:43:05 412

原创 Let's Encrypt证书自动更新

Let’s Encrypt证书自动更新Let’s Encrypt免费SSL证书用起来非常方便,但每次申请只有三个月有效期,在每次到期之前都需要重新申请,不过重新申请并不麻烦,只需要一行命令就完事:certbot renew。即便是一条命令就OK,也不想每隔三个月就需要登录到机器上执行更新命令,所以我在第一次申请之后就配置了crontab每隔两个月重新申请一次。愿景是美好的,但过了一段时...

2018-07-04 16:48:39 15008

原创 Node.js Server之三:业务框架实战

Node.js Server之三:业务框架实战此文是Node.js Server分享系列中的第三篇,上篇文章讲述了自己对业务框架的理解,在文章末尾提到用代码写一个简单的业务框架,具体实现的指导思想在前文讲过了,这篇就不再重复,这篇主要关注从代码层面如何实现,同时限于时间与篇幅,框架尽量精简,功能点到为止。特意为此文写的示例代码放在Github上,此文的基础也基于该代码,有兴趣的朋友可能要花...

2018-07-03 21:44:49 225

原创 Node.js实现基于Redis的延迟队列

Node.js实现基于Redis的延迟队列写代码的过程中,偶尔会因为业务需求而用到延迟队列,经典场景如:订单的超时关闭,签到提醒等,之前一般选择现成的云服务,但这次本着学习的目的就尝试自己实现了一番。实现的指导思想来自有赞延迟队列设计这篇文章,对于延迟队列使用场景、作用不太清楚的朋友可以通过这篇文章补一补。核心流程与设计理念照有赞的文章来,自己这篇文章主要讲实现的方式与过程中遇到的问题,所...

2018-06-25 19:24:37 1833

原创 Node.js Server之二:业务框架

Node.js Server之二:业务框架此文是自己正在使用的Node.js Server分享系列中的第二篇,继上一次的Node.js Server之一:概述后,本文讲述自己对业务框架的理解和自己的实践总结。业务框架是什么想不到一个更好的标准名词来总结自己与大家分享的这部分内容,综合考虑内容的核心是业务与框架,因而称之为业务框架。上篇文章提到Express、Koa、Egg,我称...

2018-06-20 10:19:03 225

原创 Node.js Server之一:概述

Node.js Server之一:概述最近忙于工作,将近一个月没写博客,为了能快速写些东西,打算把自己业余在使用的Node.js Server通过一系列文章向大家讲述,本文是第一篇,主要做一个整体概述。Server中部分内容也许有现成的轮子,但自己出于学习兴趣与程序员“瞎折腾”性格,都尽量自己实现。前言这个Server所用到的技术以及设计理念,目的不是为了做一个博客,更多的是作...

2018-06-08 18:25:51 1922

原创 Node.js Stream ondata触发时机与顺序

2018-05-09 11:46:23 2356

原创 Node.js Stream pipe细节

Node.js Stream pipe细节流的pipe操作主要用于readable流向writable流传递数据,之前只是从经验角度去猜测pipe的工作原理,但遇到问题时才发现不靠谱的猜测并不能为解决问题带来帮助,所以花些时间了解一下pipe的工作原理,本文主要从源代码角度解释pipe的几个内部细节。支持多个pipe下游通过阅读源代码,发现同一个readable流支持多个pipe下...

2018-05-03 23:32:54 5267

原创 Nginx配置指南

Nginx配置指南对Nginx的学习并不多,但使用起来特别顺手且心中莫名放心,本文分享一份自己的nginx配置,并选择其中的一些配置项做些说明。配置文件nginx配置文件默认存放在/etc/nginx/nginx.conf,里面主要是http上下文的配置内容,而server等内容常被拆分成子文件通过include引入,以下是自己的nginx配置内容:user root;w...

2018-04-26 00:16:04 1850

原创 HTTP/2核心特性

HTTP/2核心特性HTTP/1.1服役的这二十余年,互联网发生了翻天覆地的变化,由于各种业务场景的复杂度今非昔比,HTTP/1.1越来越容易遭受“嫌弃”,此时HTTP/2闪亮登场,本文主要列举描述其核心特性。基于HTTPS虽然RFC规范并没有约束HTTP/2必须基于HTTPS才能使用,但业界浏览器实现都依赖HTTPS前提条件,如果要升级到HTTP/2,第一步是升级到HTTPS。...

2018-04-20 11:54:08 421

原创 聊聊Lodash

聊聊Lodash如果说要推荐工具库给JavaScript新手,第一个我会选择Lodash,为什么推荐这个看似可有可无的工具库呢?因为我觉得Lodash可以传达一种编程理念,通过高层抽象概念使写出来的代码更加优雅简洁。高层抽象概念请读者先阅读下面一小段代码,留意自己理解代码所花费的时间,代码如下:let numbers = [1, 2, 3, 4, 5, 6];let ta...

2018-04-15 21:28:31 3094 2

原创 使用Chrome DevTools调试Node.js

使用Chrome DevTools调试Node.js调试对程序员的重要性不必多言,不过自己日常定位问题主要还是靠阅读代码与console大法,很少借助断点调试定位问题,主要原因在于目前使用的VIM不包含调试功能,但Node.js v6.3之后支持使用Chrome DevTools进行代码调试,本文主要讲解如何使用。概述Node.js早期版本调试用的是实现V8-Debug协议的Deb...

2018-04-04 18:03:45 754

原创 Nginx访问频率控制

Nginx访问频率控制HTTP服务器的吞吐率(单位时间吞吐量)通常有一个上限,尤其是普通配置的机器,在带宽够的情况下,用压测工具经常能把服务器压出翔,为了线上环境稳定性,防止恶意攻击影响到其他用户,可选择对客户端访问频率进行合理限制。限制原理限制原理并不难,可一句话概括为:“根据客户端特征,限制其访问频率”,客户端特征主要指IP、UserAgent等。使用IP比UserAgent更...

2018-04-02 20:30:20 1878

原创 深度学习-图片识别(下)

深度学习-图片识别(下)本文主要针对优达学城深度学习课程中的练习题任务4,整理练习内容,有兴趣者可结合本文内容然后按练习题实践,帮助理解。任务四继续之前的代码基础,为模型增加卷积神经层,主要步骤:读取数据,重新格式化 与之前的任务类似,但格式化逻辑有所变化,将原始数据由20000 x 28 x 28格式化为20000 x 28 x 28 x 1,numpy.resh...

2018-03-30 16:54:08 988

原创 Python常用模块

Python常用模块datetime日期时间类,主要熟悉API,时区的概念与语言无关。from datetime import datetime as dtdt.utcnow() # 系统UTC时间dt.now() # 系统当前时间dt(2018, 3, 27, 14, 30) # 获得2018-3-27 14:30对应的datetime对象dt.now().time...

2018-03-27 17:07:05 125

原创 深度学习-图片识别(上)

深度学习-图片识别(上)本文主要针对优达学城深度学习课程中的练习题,整理练习内容,有兴趣者可结合本文内容然后按练习题实践,帮助理解。任务一:下载并整理数据任务主要完成图片下载、图片内容数字化、选取三个数据集、打乱顺序、持久化数据等,步骤如下:下载包含10个字母的两份图片数据,large与small large与small不止数量大小区别,还在于large中的图片有没...

2018-03-27 11:39:15 8249 1

原创 Python I/O与进程

Python I/O与进程I/Owith语句with context_expression [as target(s)]: with-bodycontext_expression返回值遵从上下文管理协议,包含__enter__()与__exit__()方法,as语句的target(s)得到的是__enter__()返回值,执行with-body后会调用上下文管理...

2018-03-22 16:35:11 228

charles what

我就看看上传能给我一分 真TM扯淡 再写几句扯淡的有啥用呢 "JSON parse "{"name": "逗比"}" ;

2014-12-12

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除