无状态缓冲带来的可伸缩性

2023-11-11 13:58

本文主要是介绍无状态缓冲带来的可伸缩性,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

假设性思考~~~~

如果企业级开发中, 系统这样设计, 能否满足各类系统需求

-------- 第一阶段限制

1. 系统中所有的对象只有以下两种情况
a) 常量bean, 常量,不会改变的数据,固定配置,固定参数
a) 数据bean, 拥有getter,setter方法的纯javabean对象,均可持久化,如POJO,DTO
b) 服务bean, 即bean组件, spring管理下的bean组件,如DAO,MO,AO,SO
i. 对象的成员变量只能是bean组件
ii. 空参构造函数, 无需初使化
iii. 对象的方法的参数和返回类型必须为ID数据或数据bean
2. 数据bean均需持久化管理,或者持久化到数据库服务器,或者持久化到缓冲服务器. 方法退出后,此bean中不可以保持任何引用.
3. 数据bean的获取只能来源于
a) HTTP请求参数
b) 缓冲服务器
c) 数据库服务器
d) 其它的外部服务
4. 数据bean不能来源于当前服务器的内存缓冲或者全局变量或者本地硬盘
5. 数据bean在每台服务器获取后,都应该是一致的,不存在不同步的情况
6. 数据bean是无状态的,与服务器无关,因此bean是一致的
7. 数据bean的一致性由缓冲服务器,数据库服务器,或其它外部服务来保证
8. 换句话说, 所有服务在等待请求状态时, 本地服务器不可以保持任何数据bean的引用.


9. 服务bean中每个方法,只能接受数据bean做为参数,也只能返回数据bean做为结果
10.服务bean中每个方法,如果根据每个bean调用外部服务获取的数据一致,则相同的参数,必须返回相同的结果
11.服务bean中每个变量,不能是数据bean,只能是常量bean或者服务bean的引用,
12.服务bean中每个方法,不能依赖于成员变量, 没有上下文参数, 即此类对象性质等同于工具类助手类对象, 可实现单例模式

13.服务器集群=任意个应用服务器+外部服务器,应用服务器单点故障不会影响业务轮转

------------- 第二阶段


1. 由于数据bean是可序列化的,因此可以用固定的字符串ID来表示相应的数据bean
2. 如果数据bean实现版本管理,可以通过 id.version 来确定唯一的数据
3. 组合id.version与数据bean后产生的数据bean, 等同于常量bean
4. 由于服务bean可实现单例,因此服务bean可以用固定的字符串name来确定唯一的服务bean
5. 服务bean可以byName方式或byType注入, 再加上空参构造


------------- 第三阶段

1. 外部服务器上实现字符串ID获取最新版本的数据bean
2. 本地服务器上实现字符串name获取唯一版本的服务bean
3. 本地服务器上实现字符串name+方法名name获取服务bean指定的方法
4. 由字符串name+方法名name确定唯一ID,来确定唯一方法
5. 客户端传入字符串ID及方法ID,传至服务器,可返回唯一的字符串ID
6. 字符串ID与方法ID,确定唯一的请求ID,可转换为字符串,也可逆转换
7. 这里的唯一ID,都可以理解为常量bean


------------- 第四阶段

1. 本地服务器只处理两种逻辑
a) 传入唯一字符串ID,去外部服务器获取结果bean
b) 根据字符串ID,方法ID,处理后返回结果bean
2. 本地服务器,外地服务器都可理解为数据bean的转换器
3. 唯一ID可用来标识
a) 常量bean,数据bean,服务bean,服务bean的每种请求
4. 可使用缓冲服务器或代理服务器来缓冲唯一ID对应的各类数据


------------- 第五阶段

1. 使用URL规范来表示唯一请求ID,传至服务器,返回唯一的HTML代码
2. HTTP协议中相同的URL,在服务端数据版本相同时,应该返回相同的HTML
3. HTTP协议中与上下文参数相关的数据,应保存在HTTP.HEADER中,如处理服务器的ID,处理时间,处理版本,处理参数
4. 由HTTP协议中的last-modified,etag来标识服务端的版本号,由max-age,Expire来标识版本的生命周期
5. HTTP请求,对与相同的URL,相同版本,在生命周期内,返回唯一的HTML结果


------------------------------------>

假设以下皆可实现
1. 对数据bean操作自动保存至缓冲服务器, 根据缓冲策略刷新至数据库服务器
2. 缓冲服务器选择性支持以下缓冲,单条缓冲,分页缓冲,TOP缓冲,分类缓冲,自增缓冲
3. 数据bean是有版本的,服务bean,及服务bean中的每个方法也是有版本的


------------------------------------>

高性能WEB服务

1. 由代理服务器或者缓冲服务器缓冲HTTP结果,如果版本未更新,则返回304或者缓冲的内容
2. 当缓冲生命周期结束后,由代理服务器去应用服务器验证每个数据bean及方法的版本,如果数据及方法的版本均未改变,则返回304或者缓冲的内容
3. 如果数据bean或者方法bean更新,则由方法处理返回最新版本的结果bean,并通知代理服务器或者缓冲服务器更新版本


未完待续...

这篇关于无状态缓冲带来的可伸缩性的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/390524

相关文章

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

hdu1565(状态压缩)

本人第一道ac的状态压缩dp,这题的数据非常水,很容易过 题意:在n*n的矩阵中选数字使得不存在任意两个数字相邻,求最大值 解题思路: 一、因为在1<<20中有很多状态是无效的,所以第一步是选择有效状态,存到cnt[]数组中 二、dp[i][j]表示到第i行的状态cnt[j]所能得到的最大值,状态转移方程dp[i][j] = max(dp[i][j],dp[i-1][k]) ,其中k满足c

状态dp总结

zoj 3631  N 个数中选若干数和(只能选一次)<=M 的最大值 const int Max_N = 38 ;int a[1<<16] , b[1<<16] , x[Max_N] , e[Max_N] ;void GetNum(int g[] , int n , int s[] , int &m){ int i , j , t ;m = 0 ;for(i = 0 ;

hdu3006状态dp

给你n个集合。集合中均为数字且数字的范围在[1,m]内。m<=14。现在问用这些集合能组成多少个集合自己本身也算。 import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.Inp

从状态管理到性能优化:全面解析 Android Compose

文章目录 引言一、Android Compose基本概念1.1 什么是Android Compose?1.2 Compose的优势1.3 如何在项目中使用Compose 二、Compose中的状态管理2.1 状态管理的重要性2.2 Compose中的状态和数据流2.3 使用State和MutableState处理状态2.4 通过ViewModel进行状态管理 三、Compose中的列表和滚动

实例:如何统计当前主机的连接状态和连接数

统计当前主机的连接状态和连接数 在 Linux 中,可使用 ss 命令来查看主机的网络连接状态。以下是统计当前主机连接状态和连接主机数量的具体操作。 1. 统计当前主机的连接状态 使用 ss 命令结合 grep、cut、sort 和 uniq 命令来统计当前主机的 TCP 连接状态。 ss -nta | grep -v '^State' | cut -d " " -f 1 | sort |

状态模式state

学习笔记,原文链接 https://refactoringguru.cn/design-patterns/state 在一个对象的内部状态变化时改变其行为, 使其看上去就像改变了自身所属的类一样。 在状态模式中,player.getState()获取的是player的当前状态,通常是一个实现了状态接口的对象。 onPlay()是状态模式中定义的一个方法,不同状态下(例如“正在播放”、“暂停

qml states 状态

states 状态 在QML中,states用于定义对象在不同状态下的属性变化。每个状态可以包含一组属性设置,当状态改变时,这些属性设置会被应用到对象上。 import QtQuick 2.15import QtQuick.Controls 2.15// 定义应用程序的主窗口ApplicationWindow {visible: true // 使窗口可见width: 640 /

[轻笔记] ubuntu Shell脚本实现监视指定进程的运行状态,并能在程序崩溃后重启动该程序

根据网上博客实现,发现只能监测进程离线,然后对其进行重启;然而,脚本无法打印程序正常状态的信息。自己通过不断修改测试,发现问题主要在重启程序的命令上(需要让重启的程序在后台运行,不然会影响监视脚本进程,使其无法正常工作)。具体程序如下: #!/bin/bashwhile [ 1 ] ; dosleep 3if [ $(ps -ef|grep exe_name|grep -v grep|

颠覆你的开发模式:敏捷思维带来的无限可能

敏捷软件开发作为现代软件工程的重要方法论,强调快速响应变化和持续交付价值。通过灵活的开发模式和高效的团队协作,敏捷方法在应对动态变化和不确定性方面表现出色。本文将结合学习和分析,探讨系统变化对敏捷开发的影响、业务与技术的对齐以及敏捷方法如何在产品开发过程中处理持续变化和迭代。 系统变化对敏捷软件开发的影响 在敏捷软件开发中,系统变化的管理至关重要。系统变化可以是需求的改变、技术的升级、