Dev's Logging

Welcome to my blog !


Get back up and try again: retrying in Python

Published at April 17, 2019 ·  1 min read

在 error retry 设计中的一个技巧,对于后端微服务架构中,当一个被其他服务依赖度很高的服务崩溃时,其他服务相关的请求 failed 后该如何做呢?是不断的重试?如果一个很小的错误引发短暂的 failed,后续会引发其他相关依赖的服务短时间内的大量重试反而会加重该服务的负载压力。所以需要一个 exponential backoff 或者 randomized backoff 机制,将之后的重试以随机时间或指数关系后退,直到服务上线,避免雪崩效应 Get back up and try again: retrying in Python...

What are metaclasses in Python?

Published at April 17, 2019 ·  1 min read

python 中的 metaclass 究竟是什么。metaclass 是 class 的 class,class 是 metaclass 的一个实例。在 Python 中 type 则是一个常见 metaclass What are metaclasses in Python?...

Get back up and try again: retrying in Python

Published at April 17, 2019 ·  1 min read

装饰器的一个很好的用法,将 retry 的时间 randomize 以实现避免用尝试将服务器带来放大的压力 Get back up and try again: retrying in Python...

What is the difference between switch and select in Go?

Published at April 16, 2019 ·  1 min read

Golang 中 switch 和 select 的区别,最大的则是,switch 根据常规的状态进行判断,而 select 则是针对与 channel 一起使用,若无 default 时,则为阻塞 What is the difference between switch and select in Go?...

Socket Programming in Python (Guide) – Real Python

Published at April 16, 2019 ·  1 min read

在 Python 中进行 Socket 编程。服务端先行通过 socket(), bind(), listen(), accept() 建立一个 socket 监听链接,等待客户端的数据,客户端则通过 socket,connect 向服务端发起建立链接的请求,一旦链接建立,则服务端与客户端均可向双方发送接受数据,当客户端发送一个 close 的请求给服务端,服务端则关闭相应的链接。 Socket Programming in Python (Guide) – Real Python...

Client Session vs. Server Session

Published at April 16, 2019 ·  1 min read

server side session 和 client side session 的优劣,server 端的优势是可以立即废除 session,cookie 的 size 更小,用户的信息未被暴露,无须提高 cookie 大小即可存储大量 session,缺点则是复制会造成 性能的损耗以及提高复杂度,中央的数据存储将会限制伸缩并且提高延时,将 session 保存到特定服务器,则会导致服务器出现当机问题。由此可见,将一个 stateful 的服务伸缩是非常困难的。但是我们可以将 session 数据保存到客户端,以使 service stateless。client side session 的优势是,低延时,创建和验证 session 非常快,无须访问数据库,服务端无须管理状态,服务端无须 replicate,新的服务器可以很快的添加。但是缺点则是,session 不能被立即撤销,当一切都存储在 cookie 中时,实现细节和用户信息都被暴露了,因此需要一个很强的加密算法。cookie size 更大了。 Client Session vs. Server Session...

When should server side sessions be used instead of client side sessions?

Published at April 16, 2019 ·  1 min read

针对 server side session 和 client side session 的区别,将 session 保存在 client side 一大原因往往是安全问题,如果被更改则如何验证。server side session 相对来说比较安全,但是在 scaleable system 中,往往会容易成为瓶颈 When should server side sessions be used instead of client side sessions?...

HTTP cookies

Published at April 16, 2019 ·  1 min read

Cross-site request forgery (CSRF) 这篇文章很好的解释了 CSRF 存在的来由,通过伪造 <img> 资源或 form 请求,以达到跨站获取当前用户 cookie 实现跨站攻击的目的,一个比较好的解决方式便是在后端生成 CSRF token 发送给前端,并在提交数据时在后端验证 token,此方法 只是针对 post,put 等会修改后端内容的方法,针对 get 则在设计上遵循幂等性只请求后端资源,而不进行修改。 HTTP cookies...

Memory management in Python

Published at April 14, 2019 ·  1 min read

Python 的内存管理模型,在 Python 中,一切都是 object (对象)。为了更加高效的管理内存,设计了三种不同的数据结构,Block, Pool, Arena. Block 为最小的数据结构,从 8 到 512 bytes,但必须是 8 的整数,被划分为 64 种不同的大小。Pool 则是大小相同的 Block 的集合,一般情况下 Pool 的大小等于 Memory page ,4 kb。将 Pool 限定在只包含固定大小的 Block 是为了方便 fragmentation (碎片)管理,当一个 block 被消除后,随即可以用一个新的 block 填充上来。Pool 是由 doubly linked list (双向链表)链接而成。Arena 是堆上分配的 256k 大小的内存块,为 64 个 pool 提供存储空间。Python 的 small object manager 很少将内存归还给操作系统,只有当Arena 中所有的 Pool 为空时,Arena 才会被释放,也只有短时间内有大量的临时 objects 时才会出现这种情况。所以,对于一些长期运行的 Python 进程,可能会因此占用大量未被释放的内存。 Memory management in Python...

Tags

abcs accept acid activemq affinity algorithm allocation android array async aws b+tree b-tree backoff benchmark best-practices bfs big-o bigquery bind bitcount blog break broker bubble buffer cache cap cert cgroups channel citus class classmethod closure closures cluster concurrency config consistency consumer container context cookie cors crawler cronjob csrf ctr data-science data-structure database datadog dataflow datascience decorator deepcopy defer dfs distributed django dns docker double-shipping drf ecosia elastic-search enumerate epoll equal errgroup escaping event extra fabric2 facebook-pixel financial-report flask flutter forward-proxy freelance frontend frp garbage-collector gc gcp generator gesture get gil git golang goroutine graphql ha handbook haproxy hash hash-slot hashring hashtable hpa http http-auth http-proxy http_proxy https index init innodb instagram intention-lock intergration interview ios is javascript jinja2 jobboard json jwt k8s kafka kibana kqueue label lambda layer4 layer7 lean levels.io linked-list linux list listen loadbalancer lock logs long-tail lru marketing master matplotlib memory merge metaclass metaprogramming metrics metrics-server microservices mitm mobile model mongo mongoose mq myisam mysql namespace nat netflix network network-extension nginx nodejs nomad nosql notification npm oodesign openssl optimization orm osi pandas parallelism paramiko parkinglot patroni permission pg pipeline pixelme post postgresql postresql prefetch_related prerender private-key process proxy proxycommand put pvm python queue rabbitmq rbac react-native reactive reactjs rebase redis redis-cluster replication resource rest restfulapi retargeting retry revenue reverse-proxy rocketmq rsa rxswift saas scaffold scaleable search-engine security select seo serverless service session set shadosocks shadowsocks shard sharding shell shopify sigint signal sigterm singleton slack slave slow-query sniper sns socket socks5 source-code spa sql sqlalchemy sqs ssh ssl ssl-pinning stack startup state stateful stateless staticmethod string struct swift swiftui switch syscall system-design systemctl tcp tcp-proxy thread tmpreaper token traefik trustkit tunning type typeform udp userdefaults variable vc voidcallback vpn vuejs weak web web-development where widget with yarn zset 削峰 单例模式 宽索引 异步 看源码学-golang 窄索引 解耦 跨域 跳板机


Archives

2020 (6)
2019 (157)
0001 (5)