之前项目中有通过pkgen生成唯一id作为token字符串使用,一直未发现问题。
token = PkGen().pkgen().pk
直到前些天在测试环境(服务器为阿里云)突然开始抛出异常。
理解Linux文件系统的关键一点在于一切皆文件的思想。
Linux中,文件既包括普通数据文件,又包括如设备、管道、套接字、目录、符号链接等特殊文件。
文件系统指的是常规文件和目录的组织集合,Linux支持多种文件系统,并提供虚拟文件系统(VFS)来隐藏不同文件系统的实现细节。
Linux内核维护了三种与文件相关的数据结构,也提供了一套通用的文件I/O模型对所有类型的文件进行操作。
该系列文章为《Linux/Unix系统编程手册》的学习笔记,由于该书太过冗长,属于工具书的类别,这里对书中的一些核心内容加以提炼和整理。 书中的编程练习这里不做展示和说明。
本文对Linux系统编程的一些基本概念做一些介绍,对应用程序系统调用的流程进行说明。
该系列文章为《Linux/Unix系统编程手册》的学习笔记,由于该书太过冗长,属于工具书的类别,这里对书中的一些核心内容加以提炼和整理。 书中的编程练习这里不做展示和说明。
如今,各类Web架构竞相辉映,集群,微服务,异地多活,分布式等名词层出不穷,这些东西是你日常工作的一部分,或者至少也是不少技术类文章中的热词,于开发人员来讲并不生疏。但这些东西是怎么来的,为了解决什么样的问题,确是值得思索的命题。
其实,如今各类成熟的Web服务架构并非一蹴而就的,而是随着服务规模的不断增大而演化过来的。刚来时可能服务的用户并不多,业务线也很少,这时的应用程序、数据库、静态文件可能都在一台服务器上,代码能够正常运行即可满足要求。而随着用户量的增加,一台服务器就无法满足需求了,流量的上升导致访问速度越来越慢,数据量的增大导致储存空间的不足,这时候就会将应用程序、数据库和文件服务进行分离,分别放在三台服务器上。之后,随着规模进一步加大,越来越多的问题暴露出来:为了解决应用程序服务的压力,出现了代理服务器、集群和负载均衡的概念;为了解决数据库压力,出现了读写分离、缓存服务器和分布式数据库的概念;为了解决文件服务器的压力,出现了CDN加速的概念;为了应对冗杂的业务线,出现了微服务和职能划分的概念……服务架构也慢慢趋于成熟变成了现在的模样。
本文就简单介绍下大规模Web服务发展过程中出现的一般性问题和解决方案。
当多个线程同时操作共享的内存数据时,为了解决线程安全问题,各语言都引入并发锁来确保同一时间只有一个线程会操作共享内存。而现在的大规模互联网应用一般采用分布式和集群来提高后端服务性能,同一个服务可能在不同的机器或容器中都存在实例,多线程中的并发锁也失去了意义,这时就引入了分布式锁的概念,当然它们的目的是相同的,都是为了限制同一时间内一个资源只能被一个请求操作,或者说某个方法只能被运行一次。
目前业内实现分布式锁的方式主要有下面三种:
基于数据库的悲观锁乐观锁
基于redis的分布式事务锁
基于Zookeeper的节点锁
其中redis简单易用,应用最广也较为稳定,本文主要介绍这种方式下的分布式锁。