Python 全栈系列226 GlobalBuffer

说明

为了简化开发程序,特别是需要依赖全局数据的程序,例如:分布式任务需要知道当前可处理的任务;定时程序需要依据某个约束性全局变量。一个附带的好处是会大量减少对数据库产生的请求。

GlobalBuffer的代价并不高:

  • 1 一个新的服务
  • 2 多一次的序列和反序列化

内容

1 微服务结构

微服务 - 对象 - 微服务

这大约是第一次再用微服务去套调用微服务的对象。层级关系大约是这样的:

  • 1 先构建了Redis数据库容器,用于一般的KV存储和消息队列(功能简单)。
  • 2 因为直接访问Redis比较麻烦,需要有对应的py包等,所以构造了RedisAgent,用微服务方式来代理数据库请求。
  • 3 因为直接调用接口写起来很麻烦,所以构造了RedisOrMongo对象,结合了Redis缓存和Mongo持久化存储的功能,进行初始化配置后就可以进行简单的重复调用。
  • 4 不是所有的程序都会频繁的操作,可能只是偶尔读一次。而且程序所处的环境可能与算网的环境不在一起,频繁配置反而成了比较麻烦的事,所以现在又想构造GlobalBuffer来提供特别简单的数据操作透传。

2 设计

简单以及更简单

微服务的功能是很容易拓展的,本阶段要做的是第一步:就是透传KV操作。

GlobalBuffer 提供了一个可外网访问的地址,提供KV的读取与存储。同时GlobalBuffer需要给出变量命名的约束检查。

这样在许多程序分布式执行时,可以通过某个变量

3 实现

先进行命名: global_buffer_24088

再创建了项目文件夹之后,先按照GlobalFunc的【场景四:任意环境】方式将RedisOrMongo的相关文件拉取过来。需要额外关注的是,本来也可以直接使用【 场景二:算网机,挂载git目录使用】方式的,但是一方面最近没有时间去check这个镜像里内容是否是最新的;另一方面,当前需求确实足够简单,因此还是用前者。

场景四只要从ftp上下载几个文件就可以了

wget -NO RedisOrMongo_v100.py http://ftp/BaseFunc.RedisOrMongo_v100.py
wget -NO WMongo_V9000_012.py http://ftp/BaseFunc.WMongo_V9000_012.py
wget -NO worker_gen_file.py http://ftp/BaseFunc.worker_gen_file.py

采用Tornado来实现接口

server.py

from RedisOrMongo_v100 import RedisOrMongo,Naive,redis_cfg
# 各种rom的缓存
rom_dict = {}GetxHandler_path = r'/getx/'
class GetxHandler(tornado.web.RequestHandler):def post(self):request_body = self.request.bodysome_dict = json.loads(request_body)space = some_dict['space']varname = some_dict['varname']ttl = some_dict.get('ttl') or 86400if space not in rom_dict.keys():the_rom = RedisOrMongo(space, redis_cfg.dict(),backend='mongo', mongo_servername='m7.24065')rom_dict[space] = the_romelse:the_rom = rom_dict[space] res = the_rom.getx(varname,ttl = ttl)self.write(json.dumps(res))
getx_tuple = (GetxHandler_path,GetxHandler)
app_list.append(getx_tuple)SetxHandler_path = r'/setx/'
class SetxHandler(tornado.web.RequestHandler):def post(self):request_body = self.request.bodysome_dict = json.loads(request_body)space = some_dict['space']varname = some_dict['varname']value = some_dict['value']ttl = some_dict.get('ttl') or 86400persist = True if some_dict.get('persist') is not None else False if space not in rom_dict.keys():the_rom = RedisOrMongo(space, redis_cfg.dict(),backend='mongo', mongo_servername='m7.24065')rom_dict[space] = the_romelse:the_rom = rom_dict[space] # 如果persist 不为True那么只写redisres = the_rom.setx(varname,value,ttl = ttl,persist=persist)self.write(json.dumps(res))
setx_tuple = (SetxHandler_path,SetxHandler)
app_list.append(setx_tuple)if __name__ == '__main__':#tornado.options.parse_command_line()apps = tornado.web.Application(app_list, **settings)http_server = tornado.httpserver.HTTPServer(apps)define('port', default=8000, help='run on the given port', type=int)http_server.listen(options.port)# 单核# 多核打开注释# 0 是全部核# http_server.start(num_processes=10) # tornado将按照cpu核数来fork进程# ---启动print('Server Started')tornado.ioloop.IOLoop.instance().start()

只要启动server.py就可以了。

使用测试

import requests as req ...: req.get('http://%s:24088/' % wan_ip).text...:
Out[7]: '【GET】This is Website for Internal API SystemPlease Refer to API document'In [8]: getx_dict = {'space':'tem_test.test',...:             'varname':'x002',...:             'ttl': 500 # 可以不写,默认86400...: }...:...: getx_res = req.post('http://%s:24088/getx/' % wan_ip,json = getx_dict).json()...:In [9]: getx_res
Out[9]: 123In [10]: # setx 测试...: setx_dict = {'space':'tem_test.test',...:             'varname':'x002',...:             'value':11111,...:             'ttl': 500, # 可以不写,默认86400...:             'persist': 'yes' # persist 可以不写,为空时不持久化到mongo...: }...:...: setx_res = req.post('http://%s:24088/setx/' % wan_ip,json = setx_dict).json()...:In [11]: setx_res
Out[11]: TrueIn [12]: getx_res = req.post('http://%s:24088/getx/' % wan_ip,json = getx_dict).json()In [13]: getx_res
Out[13]: 11111In [14]: getx_res = req.post('http://%s:24088/getx/' % wan_ip,json = getx_dict).json()In [15]: getx_res
Out[15]: 11111

其中getx是从redis中取数(如果redis中没有数,那么就从mongo中读取),同时也可以设置ttl,这样取完之后一段时间数据会自动删除;setx则是设置变量,其中还有一个persist参数,如果不为空,那么就会持久化到mongo中;否则只是在redis中设置。

操作最慢大约耗时100ms,最短的不到3ms。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/710302.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于C++的http通信记录,使用httplib,Windows环境,vscode,mingw

使用了 httplib库,链接,使用该库只需要包含头文件即可,另外在Windows环境下,使用mingw构建项目,需要在编译时链接网络编程库,task.json如下: {"version": "2.0.0","t…

【MATLAB源码-第149期】基于MATLAB的2ASK,2FSK,2PSK,2DPSK等相干解调仿真,输出各节点波形。

操作环境: MATLAB 2022a 1、算法描述 2ASK(二进制幅移键控)、2FSK(二进制频移键控)、2PSK(二进制相移键控)和2DPSK(二进制差分相移键控)是数字调制技术中的基本调制方…

汽车三元催化器的废品项目详解,三元催化再生项目的回收技术教学

一、教程描述 这是一个收废品项目,就收那些别人不懂的,三元催化器的附加值高,只要掌握技术,怎么玩都行的,只是要放得下你的面子。三元催化器,是安装在汽车排气系统中最重要的机外净化装置,它可…

MATLAB环境基于全局和局部多特征融合的红外图像分割主动轮廓模型

红外图像是一种热图像,不受光照影响,在光照条件差、有烟雾遮挡的环境中,可以辅助或代替可见光成像在各个领域中应用,同时作为热成像,对景物的热辐射敏感,在安全监测、质量检验等领域具有优势。在以下几个方…

Apache Doris Sink Connector部署指南

在当今数据驱动的时代,如何高效、准确地处理和分析大数据成为了各行各业面临的共同挑战。Apache Doris,作为一个基于 MPP 架构的高性能、实时的分析型数据库,为大规模数据分析提供了强大的支持。 在当今数据驱动的时代,如何高效、…

CSS的弹性布局

CSS 的弹性布局 前言 前端中为了实现页面的布局效果,采用的一个技术手段,它在前端开发的技术场景是非常广泛的 实现上述区域的页面相关的布局效果,就可以使用弹性布局来完成 弹性布局(flex布局) flex 是 flexible box 的缩写,…

MongoDB聚合运算符:$cos

文章目录 语法使用举例余弦值角度余弦值弧度 $cos聚合运算符用来计算余弦值&#xff0c;返回指定表达式的余弦值。 语法 { $cos: <expression> }<expression>为可被解析为数值的表达式$cos返回弧度&#xff0c;使用$radiansToDegrees运算符可以把弧度转换为角度$…

现代企业架构框架——应用架构

现代企业架构框架——应用架构。 现代企业架构中的应用架构是指企业在构建和维护应用系统时所采用的一种架构框架。应用架构旨在实现应用系统的可扩展性、灵活性、可维护性和可重用性,以满足企业在数字化时代对应用系统的快速交付和持续创新的需求。下面将详细介绍应用架构的…

文生视频基础1:sora技术报告学习

sora技术报告学习 背景学后理解训练流程技术拆解编码解码扩散模型训练用数据 28号直播交流会后的一些想法自身的一点点想法 参考 原文地址&#xff1a;Video generation models as world simulators 背景 此项目的背景是基于Datawhale的关于sora技术文档的拆解和相关技术讲解…

GEE入门篇|图像处理(二):在Earth Engine中进行波段计算

目录 波段计算 1.NDVI的计算 2.NDVI 归一化差值的单次运算计算 3.使用 NDWI 的归一化差值 波段计算 许多指数可以使用 Earth Engine 中的波段运算来计算。 波段运算是对图像中两个或多个波段进行加、减、乘或除的过程。 在这里&#xff0c;我们将首先手动执行此操作&#x…

mac 终端 任何命令都运行不了了

特殊情况 记录一下 mac 配置是发生错误 导致几乎所有命令都运行不了了 下面解决方案 这可能是由于你的 PATH 没有设置正确&#xff0c;或者 .bash_profile 或 .zshrc 文件中存在语法错误。你可以尝试以下方法来解决这个问题&#xff1a; 打开一个新的终端窗口。 通过输入 /bin…

Redis第6讲——主从复制模式详解

Redis的读写性能很高&#xff0c;但在面对大规模数据和高发访问的挑战时&#xff0c;单节点的Redis可能无法满足需求&#xff0c;这就引出了Redis集群的概念。本节先介绍一下Redis高可用方案之一的主从复制模式&#xff0c;虽说现在基本不会用这种模式&#xff0c;但是无论是哨…

特征值和特征向量及其在机器学习中的应用

特征值和特征向量是线性代数中的概念&#xff0c;用于分析和理解线性变换&#xff0c;特别是由方阵表示的线性变换。它们被用于许多不同的数学领域&#xff0c;包括机器学习和人工智能。 在机器学习中&#xff0c;特征值和特征向量用于表示数据、对数据执行操作以及训练机器学…

掌握电子邮件的未来:深入解析IMAP4的革命性特性与实践

IMAP4基本概念 Internet Message Access Protocol, Version 4 (IMAP4) 是一种广泛使用的邮件获取协议&#xff0c;它允许邮件客户端访问和操作远程邮件服务器上存储的邮件信息。IMAP4是IMAP协议的最新版本&#xff0c;提供了更加丰富的邮件处理功能&#xff0c;如邮件搜索、标…

SpringSecurity入门demo(四)权限校验

用户认证授权后&#xff0c;就可以进行接口权限控制。思路是拿用户&#xff08;已授予的&#xff09;权限与接口所需权限进行比较&#xff0c;不包含则视为无权。在SpringSecurity中&#xff0c;权限校验可以通过以下方式实现&#xff1a; &#xff08;1&#xff09;自定义拦截…

SQL 语句创建数据库

文章目录 MysqlPostgreInfluxDB语法使用 DROP DATABASE 删除数据库 Mysql mysql创建数据库需要账号具有高权限,我们创建一个test001数据库 mysql> CREATE DATABASE test001;使用该SHOW语句找出服务器上当前存在哪些数据库&#xff1a; mysql> SHOW DATABASES; -------…

使用分布式锁解决分布式环境下的并发安全问题

分布式锁 分布式锁的基本概念 在我们进行单机应用开发&#xff0c;涉及并发同步的时候&#xff0c;我们往往采用synchronized或者Lock的方式来解决多线程间的代码同步问题&#xff0c;这时多线程的运行都是在同一个JVM之下。但当我们的应用是分布式集群工作的情况下&#xff…

windows下使用vscode + NDK搭建 Android c++编译环境

需要的环境&#xff1a; NDK cmake&#xff08;若用android studio用过cmake则在sdk下有&#xff09; main.cpp 测试printf打印和log打印 #include <jni.h> // 需要智能提示则在 .vscode/c_cpp_properties.json 将 ndk 下的 toolchains\\llvm\\prebuilt\\windows-x8…

MWC 2024 | 广和通携手意法半导体发布智慧家居解决方案

世界移动通信大会2024期间&#xff0c;广和通携手横跨多重应用领域、全球排名前列的半导体公司意法半导体&#xff08;STMicroelectronics&#xff0c;以下简称ST&#xff1b;纽约证券交易所代码&#xff1a;STM&#xff09;发布支持Matter协议的智慧家居解决方案。该方案在广和…

【两万字面试系列】三年前的面试题。Service里面的线程安全问题

前言 三年前&#xff0c;大概是21年&#xff0c;那会刚学完java&#xff0c;然后去面试&#xff0c;被打的一塌糊涂&#xff0c;今天来盘一盘之前的面试&#xff0c;到底是怎样的问题整住了。然后发现了去年整的线程安全东西&#xff0c;也贴到文章后面了。那个贴的还不太准&a…