网站搜索排名优化怎么做,网站建设好的,长清网站建设费用,腾讯网站认证1 python实现rpc的几种方式 1.1 SimpleXMLRPCServer 自带的 1.2 第三方ZeroRPC
2 连接linux远程开发 3 分布式锁 4 分布式id 1 python实现rpc的几种方式
# 远程过程调用-1 借助于rabbitmq,可以跨语言-2 SimpleXMLRPCServer 自带的-3 ZeroRPC-4 GRPC#xff1a;跨语言的 htt…1 python实现rpc的几种方式 1.1 SimpleXMLRPCServer 自带的 1.2 第三方ZeroRPC
2 连接linux远程开发 3 分布式锁 4 分布式id 1 python实现rpc的几种方式
# 远程过程调用-1 借助于rabbitmq,可以跨语言-2 SimpleXMLRPCServer 自带的-3 ZeroRPC-4 GRPC跨语言的 https://zhuanlan.zhihu.com/p/4257251921.1 SimpleXMLRPCServer 自带的
### 服务端
from xmlrpc.server import SimpleXMLRPCServer# 通信使用xml格式
class RPCServer(object):def add(self,a,b):return ab# SimpleXMLRPCServer
server SimpleXMLRPCServer((localhost, 4242), allow_noneTrue)
server.register_introspection_functions()
server.register_instance(RPCServer())
server.serve_forever()#### 客户端
import time
from xmlrpc.client import ServerProxy# rpc 调用和http什么关系1 rpc 不是一种协议它是一个概念远程过程调用的概念中间通过网络底层可以基于tcp也可以基于http基于tcp自定制协议
2 有的rpc框架用了http协议
2 有的rpc框架直接使用tcp
# SimpleXMLRPCServer 底层使用了http协议速度稍微慢一些
def xmlrpc_client():print(xmlrpc client)c ServerProxy(http://localhost:4242)resc.add(3,4)print(通过rpc执行结果是,res)if __name__ __main__:xmlrpc_client()# 速度慢 1 基于http 2 交互使用的xml格式 1.2 第三方ZeroRPC ### 服务端
import zerorpcclass RPCServer(object):def add(self,a,b):print(ab,ab)return ab
# zerorpc
s zerorpc.Server(RPCServer())
s.bind(tcp://0.0.0.0:4243)
s.run()#### 客户端
import zerorpc
import time# zerorpc
def zerorpc_client():print(zerorpc client)c zerorpc.Client()c.connect(tcp://127.0.0.1:4243)print(c.add(88, 77))if __name__ __main__:zerorpc_client() 2 连接linux远程开发
# 咱么开发的环境-1 win 开发linux上线-2 linux开发Linux上线-乌班图-》台式机--》装乌班图--》乌班图开发-3 mac系统linux上线-mac环境跟linxu很像# 只有win机器没有linux项目要在linux下开发---》远程连接到linux中开发---》解释器用了远程linux的# 使用pycharm远程连接linxu开发-本地代码传到linux-使用linux的解释器运行代码---》配置远端解释器-以后 在本地右键运行实际上等同于连到linux机器执行# win---》远端docker容器中开发 3 分布式锁
# 分布式系统中加锁---》悲观锁-mysql 行锁 性能不高-性能更高的分布式锁# python 线程锁# 分布式锁具备条件
1、在分布式系统环境下一个方法在同一时间只能被一个机器的一个线程执行
2、高可用的获取锁与释放锁
3、高性能的获取锁与释放锁
4、具备可重入特性
5、具备锁失效机制防止死锁
6、具备非阻塞锁特性即没有获取到锁将直接返回获取锁失败# 三种方式实现
基于数据库实现分布式锁---》行锁
基于缓存Redis等实现分布式锁----redis官方提供
基于Zookeeper实现分布式锁分布式协调服务 # pip3 install redlock-py
from redlock import Redlock
import time
dlm Redlock([{host: localhost, port: 6379, db: 0}, ])# 获得锁
my_lock dlm.lock(my_resource_name,1000)# 业务逻辑代码
print(sdfasdf)
time.sleep(20)# 释放锁
dlm.unlock(my_lock)# 这个代码可以放在任意的节点上使用的是分布式锁某个节点获取到锁后别的节点获取不到操作数据释放锁后别的节点的线程才能操作数据3.1 自己基于redis实现分布式锁
# redis 分布式锁底层如何实现的SETNX当且仅当key不存在时set一个key为val的字符串返回1若key存在则什么都不做expire超过这个时间锁会自动释放避免死锁deleteRedis实现分布式锁的时候删除锁import redis
import uuid
import timefrom threading import Thread,get_ident# 连接redis
redis_client redis.Redis(hostlocalhost,port6379,# passwordpassword,db10)# 获取一个锁
# lock_name锁定名称
# acquire_time: 客户端等待获取锁的时间
# time_out: 锁的超时时间
def acquire_lock(lock_name, acquire_time10, time_out10):获取一个分布式锁identifier str(uuid.uuid4())end time.time() acquire_timelock string:lock: lock_namewhile time.time() end:if redis_client.setnx(lock, identifier):# 给锁设置超时时间, 防止进程崩溃导致其他进程无法获取锁redis_client.expire(lock, time_out)return identifierelif not redis_client.ttl(lock):redis_client.expire(lock, time_out)time.sleep(0.001)return False# 释放一个锁
def release_lock(lock_name, identifier):通用的锁释放函数lock string:lock: lock_namepip redis_client.pipeline(True)while True:try:pip.watch(lock)lock_value redis_client.get(lock)if not lock_value:return Trueif lock_value.decode() identifier:pip.multi()pip.delete(lock)pip.execute()return Truepip.unwatch()breakexcept redis.excetions.WacthcError:passreturn Falsedef seckill():identifier acquire_lock(resource)print(get_ident(), 获得了锁)release_lock(resource, identifier)if __name__ __main__:for i in range(50):t Thread(targetseckill)t.start() 4 分布式id
# 在复杂分布式系统中往往需要对大量的数据和消息进行唯一标识# 分布式id特点全局唯一性不能出现重复的ID号既然是唯一标识这是最基本的要求。 # uuid 趋势递增在MySQL InnoDB引擎中使用的是聚集索引由于多数RDBMS使用B-tree的数据结构来存储索引数据在主键的选择上面我们应该尽量使用有序的主键保证写入性能。单调递增保证下一个ID一定大于上一个ID例如事务版本号、IM增量消息、排序等特殊需求。信息安全如果ID是连续的恶意用户的扒取工作就非常容易做了直接按照顺序下载指定URL即可如果是订单号就更危险了竞对可以直接知道我们一天的单量。所以在一些应用场景下会需要ID无规则、不规则。# 生成分布式锁方案
-uuid import timeimport uuidresuuid.uuid1(2,int(time.time())) # b5503ec0-42ff-11ee-adb4-000000000002print(res)-数据自增性能第-Redis生成ID时间戳incr-snowflake雪花算法方案pysnowflake雪花算法的使用场景就很明确了用于确保全局唯一的id。还有一个从名字无法看出的特点就是还能保证id的自增属性。Snowflake 以 64 bit 来存储组成 ID 的4 个部分
1、最高位占1 bit值固定为 0以保证生成的 ID 为正数
2、中位占 41 bit值为毫秒级时间戳
3、中下位占 10 bit值为工作机器的 ID值的上限为 1024
4、末位占 12 bit值为当前毫秒内生成的不同 ID值的上限为 4096-美团leaf算法