架构演进-实例篇

简介:
1引言
在标题的取名上,不敢说颇费心机,也算得上花费了一点功夫的。首先想到的是“架构设计过程”,又觉得是不是太大了,因为例子比较局部,不是很完整。叫做“结构变化过程”可能更好点。但是又怕名字取的小气了,进来的人少,参与讨论的就更少了,最终还是取了这个有点忽悠人的标题“架构演进”。
今天的这个架构演进,使用系统中一个局部的实例进行推导和演进,一起来观察一下,架构是如何不满足需求的?架构如何演进?更好的架构应该具备哪些条件?有没有更好的呢?
业务场景
payment1图1 业务场景图
从上图可以看出,就是一个电子商务网站常见的支付、支付的后续处理,这样一个业务场景。支持多种支付方式,目前包括银联、支付宝,还有平台账户。平台账户就是注册用户将资金存储在平台为用户建立并维护的一个账户里,购买平台的产品,可以使用平台账户中的资金进行支付。
2业务流程
  1. 首先用户选择商品。
  2. 下单,进行支付。
  3. 选择支付方式。
  4. 使用相应支付方式进行支付。第三方支付,会跳转到第三方的支付页面进行支付。
  5. 平台进行支付的后续处理,包括成功之后的修改状态等,还包括失败之后的记录标记等。
第三方的支付,在打开第三方支付界面的时候,会告诉它一个平台的回调地址,支付之后,通过回调地址接收第三方支付的结果,然后进行后续处理。使用平台账户支付,就直接进行后续处理就可以了。
当然,这其中还会有一些细节,不在我们的讨论范围。例如:使用平台账户进行支付,判断账户金额是否充足。使用第三方支付,是否记录第三方支付的完整过程,以及完整的支付流程。等等具体的业务细节均不在今天的讨论范围。
 
3初级架构-用存储过程搞定它
回调地址接收两个参数,一个是订单编号,一个是标志。标志说明是成功还是失败,或者是更加详细的信息。
CREATE  PROCEDURE Proc_PaymentHandle 
  @OrderSeqNo  VARCHAR(36),   --订单编号 
  @ReturnCode  VARCHAR(10),   --返回状态码 
  @PaymentManner  CHAR(1)          --支付方式:1银联,2支付宝,3平台账户 
AS 
BEGIN 
   IF(@PaymentManner= '1'
   BEGIN 
     --更新订单状态 
     --更新银联支付信息 
     RETURN
   END 
   ELSE  IF(@PaymentManner= '2'
   BEGIN 
     --更新订单状态 
     --更新支付宝支付信息 
     RETURN
   END 
   ELSE  IF(@PaymentManner= '3'
   BEGIN 
     --更新定的状态 
     --更新平台账户支付信息 
     RETURN
   END 
END
配合一段C#代码,判断一下支付方式,然后给存储过程传递参数。这样写的话,上面的这个存储过程很容易就超过1k行了,相信大家也写过1k行以上的存储过程,也维护过这样的存储过程,知道个中的酸甜苦辣。
如果说那一天我们增加了一种支付方式,需要修改的地方包括哪些呢?
界面要修改,存储过程要打开修改,调用的C#代码要修改。真是有点麻烦,最主要的是容易改错了,误改了不应该动的地方才是最要命的。好吧,我们简单分离一下。每种支付方式一个存储过程,把对于支付方式的判断放在代码中,每种支付对应一个代码中的方法。这样需要增加一种的话,只要改改支付方式判断的代码,然后重新写一个存储过程,重新写一个方法调用一下新的存储过程就可以了。可是还有一个问题,更新订单状态好像大家都在做,如果哪一些还需要加一些大家都需要做的事情呢?或者说修改一些大家都需要做的事情的细节?又或者说某两个支付方式需要增加一个处理流程呢?打开存储过程,狂修改吧!!!!
存储过程有几个不便利的地方:
  • 调试不方便
  • 测试不方便
  • 代码不能折叠,多了之后要拖动滚动条才能找得到
  • 逻辑运算、大规模计算是存储过程的弱项
存储过程的优势至少也有一个,就是修改之后,马上可以见到效果。不用编译。
4中级架构-在代码中分离对每种信息的更新
之前的架构代码中有很多的重复地方,例如:对于订单信息的更新。如何把重复降低呢?降低重复也就集中了代码,集中了将来也好维护。而且把它分离出来,独立出来,好像更好点,在需要的地方调用就可以了。如果需要变更订单的更新细节,只要修改一下更新细节就可以了,不需要动支付的代码。减小犯错误的概率。
首先,将各种更新信息独立出来。
InBlock.gif  public  class OrderRepository3 
InBlock.gif        { 
InBlock.gif                 public  void UpdateState() 
InBlock.gif                {  throw  new System.Exception(); } 
InBlock.gif        } 
InBlock.gif         public  class PlatformAccountRepository3 
InBlock.gif        { 
InBlock.gif                 public  void Update() 
InBlock.gif                {  throw  new System.Exception(); } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         public  class ZhifubaoRepository3 
InBlock.gif        { 
InBlock.gif                 public  void Update() 
InBlock.gif                {  throw  new System.Exception(); } 
InBlock.gif        } 
InBlock.gif         public  class YinlianRepository3 
InBlock.gif        { 
InBlock.gif                 public  void Update() 
InBlock.gif                {  throw  new System.Exception(); } 
InBlock.gif        }
使用下面的方法进行支付的后续处理。
InBlock.gif  public  class Service2 
InBlock.gif        { 
InBlock.gif                 public  void HandlePaymentResult(PaymentManner2 paymentManner,  string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                         switch (paymentManner) 
InBlock.gif                        { 
InBlock.gif                                 case PaymentManner2.PlatformAccount : 
InBlock.gif                                        var platformService =  new PlatformAccountPaymentResultHandleService2(); 
InBlock.gif                                        platformService.Handle(orderSeqNo); 
InBlock.gif                                         break
InBlock.gif                                 case PaymentManner2.Yinlian : 
InBlock.gif                                        var yinlianService =  new YinlianPaymentResultHandleService2(); 
InBlock.gif                                        yinlianService.Handle(orderSeqNo); 
InBlock.gif                                         break
InBlock.gif                                 case PaymentManner2.Zhifubao : 
InBlock.gif                                        var zhifubaoService =  new ZhifubaoPaymentResultHandleService2(); 
InBlock.gif                                        zhifubaoService.Handle(orderSeqNo); 
InBlock.gif                                         break
InBlock.gif 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif public  class OrderManagement2 
InBlock.gif        { 
InBlock.gif                 public Dictionary<PaymentManner2,  string> Pay( decimal money) 
InBlock.gif                { 
InBlock.gif                         return  new PaymentMannerManagement2().FindAvailableManner(money); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif 
InBlock.gif 
InBlock.gif     
InBlock.gif         public  class PaymentMannerManagement2 
InBlock.gif        { 
InBlock.gif                 public Dictionary<PaymentManner2,  string> FindAvailableManner( decimal moneyOfPay) 
InBlock.gif                { 
InBlock.gif                         throw  new System.Exception(); 
InBlock.gif 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif      public  enum PaymentManner2 
InBlock.gif        { 
InBlock.gif                Zhifubao, 
InBlock.gif                Yinlian, 
InBlock.gif                PlatformAccount 
InBlock.gif        } 
InBlock.gif         public  class ZhifubaoPaymentResultHandleService2    
InBlock.gif        { 
InBlock.gif                 private OrderRepository2 _orderManagement; 
InBlock.gif                 private ZhifubaoRepository2 _zhifubaoManagement; 
InBlock.gif 
InBlock.gif                 public  void Handle( string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                         using (TransactionScope scope =  new TransactionScope()) 
InBlock.gif                        { 
InBlock.gif                                _orderManagement.UpdateState(); 
InBlock.gif                                 this._zhifubaoManagement.Update(); 
InBlock.gif 
InBlock.gif                                scope.Complete(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif        } 
InBlock.gif         public  class YinlianPaymentResultHandleService2    
InBlock.gif        { 
InBlock.gif                 private OrderRepository2 _orderManagement; 
InBlock.gif                 private YinlianRepository2 _yinlianManagement; 
InBlock.gif 
InBlock.gif                 public  void Handle( string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                         using (TransactionScope scope =  new TransactionScope()) 
InBlock.gif                        { 
InBlock.gif                                 this._orderManagement.UpdateState(); 
InBlock.gif                                 this._yinlianManagement.Update(); 
InBlock.gif 
InBlock.gif                                scope.Complete(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif         public  class PlatformAccountPaymentResultHandleService2    
InBlock.gif        { 
InBlock.gif                 private OrderRepository2 _orderManagement; 
InBlock.gif                 private PlatformAccountRepository2 _platformAccountManagement; 
InBlock.gif 
InBlock.gif                 public  void Handle( string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                         using (TransactionScope scope =  new TransactionScope()) 
InBlock.gif                        { 
InBlock.gif                                 this._orderManagement.UpdateState(); 
InBlock.gif                                 this._platformAccountManagement.Update(); 
InBlock.gif 
InBlock.gif                                scope.Complete(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif        }
增加支付方式的话,新建一个HandleService类,写一些处理代码,然后在public void HandlePaymentResult(PaymentManner2 paymentManner, string orderSeqNo)方法的switch中增加一个case就可以了。
但是页面的可选支付方式还是写死了,没有动态的变化,支付方式是否可以动态配置呢?而且可以方便的测试呢?例如:虽然我还没有银联的接口,但是我想测试一些,银联支付之后平台的处理是否正确,该更新的信息是否都更新了呢?没有银联的接口,是不是就不能做了呢?有没有办法解决呢?
答案是:有。
还有就是上面的switch。。。case,好像会很长,也很丑,这个地方能否改进呢?很多人在学习了重构之后,会提出很多的方法来解决这个问题,我们再后面也一块来解决一下。
5高级架构-少用存储过程处理业务的灵活架构
我们的高级架构有几个目标
  • 减少存储过程中的业务逻辑,让存储过程更加纯粹的做事,做它擅长的事情。
  • 可以灵活的增加或者减少支付方式。达到在增加或者减少支付方式的时候,尽量少的修改代码,尽量减少依赖。减少支付对于支付方式的依赖,支付方式对于后续处理的依赖。
  • 代码结构更加清晰。
为了达到上面的几个目标,计划独立几个部分。
  • 支付方式的管理。
  • 每一种支付方式的处理过程。这个在中级架构里面已经做的差不多了,这里会做的更好一点,抽象这个支付处理过程。
还有就是要隐藏支付方式和具体的支付方式处理过程映射代码。具体的支付方式指的是:银联或者是支付宝这种具体的一种支付方式。目的就是让对于支付订单的处理独立化,固定化,支持变化。
5.1支付方式的管理
InBlock.gif  public  enum PaymentManner1 
InBlock.gif        { 
InBlock.gif                Zhifubao, 
InBlock.gif                Yinlian, 
InBlock.gif                PlatformAccount 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         public  class PaymentMannerParams 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 地址还是内部方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 public UriOrFunction UriOrFunction { get; set; } 
InBlock.gif              /// <summary> 
InBlock.gif              /// 地址 
InBlock.gif              /// </summary> 
InBlock.gif                 public  string Uri { get; set; } 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 方法名 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  string FunctionName { get; set; } 
InBlock.gif 
InBlock.gif 
InBlock.gif                 enum UriOrFunction 
InBlock.gif                { 
InBlock.gif                        Uri, 
InBlock.gif                        Function 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         public  class PaymentMannerManagement1 
InBlock.gif        { 
InBlock.gif                 public Dictionary<PaymentManner1, PaymentMannerParams > FindAvailableManner( decimal moneyOfPay) 
InBlock.gif                { 
InBlock.gif                         throw  new System.Exception(); 
InBlock.gif                         
InBlock.gif                } 
InBlock.gif        } 
通过FindAvailableManner方法获取支付方式。每种支付方式PaymentManner,都带有一个参数实体PaymentMannerParams,里面的UriOrFunction来决定是通过网页还是内部方法来支付,Uri就跳转到Uri就可以了,Function就调用FunctionName中的方法就可以了。支付的时候用下面的Pay先获取支付方式信息,然后根据每种支付方式的参数来决定具体的支付。
InBlock.gif public  class OrderManagement1 
InBlock.gif        { 
InBlock.gif                 public  void    Pay( decimal money) 
InBlock.gif                { 
InBlock.gif                        var manner=  new PaymentMannerManagement1().FindAvailableManner(money); 
InBlock.gif                         //后续支付 
InBlock.gif                } 
InBlock.gif        }
 
之前说的,如果银联还没有接口,或者接口暂时不能用了,想测试一下后续的处理,就可以将银联这种Manner的UriOrFunction设置为Function,现用内部的方法来测试后续的处理是否正确。等可以用的时候,在变更为Uri就可以了。
5.2支付过程的抽象
通过建立支付处理的接口,将支付处理的代码抽象成下面的样子。
 
InBlock.gif  public  class Service1 
InBlock.gif        { 
InBlock.gif                 public  void HandlePaymentResult(PaymentManner1 paymentManner, string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                        IPaymentResultHandleService1 handleService = PaymentResultHandleServiceFactory1.GetService(paymentManner); 
InBlock.gif                        handleService.Handle(orderSeqNo); 
InBlock.gif                } 
InBlock.gif        }
这个处理的代码,原则来说以后都不需要修改了。后面要做的就是定义一种新的支付方式枚举量,然后实现IPaymentResultHandleService1 接口,写一些处理的代码就可以了。
5.3完整代码
 
InBlock.gif using System; 
InBlock.gif using System.Collections.Generic; 
InBlock.gif using System.Linq; 
InBlock.gif using System.Text; 
InBlock.gif using System.Transactions; 
InBlock.gif 
InBlock.gif namespace ConsoleApplication1 
InBlock.gif
InBlock.gif 
InBlock.gif         public  class Service1 
InBlock.gif        { 
InBlock.gif                 public  void HandlePaymentResult(PaymentManner1 paymentManner, string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                        IPaymentResultHandleService1 handleService = PaymentResultHandleServiceFactory1.GetService(paymentManner); 
InBlock.gif                        handleService.Handle(orderSeqNo); 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif 
InBlock.gif         public  class OrderManagement1 
InBlock.gif        { 
InBlock.gif                 public  void    Pay( decimal money) 
InBlock.gif                { 
InBlock.gif                        var manner=  new PaymentMannerManagement1().FindAvailableManner(money); 
InBlock.gif                         //后续支付 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif 
InBlock.gif 
InBlock.gif         public  enum PaymentManner1 
InBlock.gif        { 
InBlock.gif                Zhifubao, 
InBlock.gif                Yinlian, 
InBlock.gif                PlatformAccount 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         public  class PaymentMannerParams 
InBlock.gif        { 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 地址还是内部方法 
InBlock.gif                 /// </summary> 
InBlock.gif                 public UriOrFunction UriOrFunction { get; set; } 
InBlock.gif              /// <summary> 
InBlock.gif              /// 地址 
InBlock.gif              /// </summary> 
InBlock.gif                 public  string Uri { get; set; } 
InBlock.gif                 /// <summary> 
InBlock.gif                 /// 方法名 
InBlock.gif                 /// </summary> 
InBlock.gif                 public  string FunctionName { get; set; } 
InBlock.gif 
InBlock.gif 
InBlock.gif                 enum UriOrFunction 
InBlock.gif                { 
InBlock.gif                        Uri, 
InBlock.gif                        Function 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         public  class PaymentMannerManagement1 
InBlock.gif        { 
InBlock.gif                 public Dictionary<PaymentManner1, PaymentMannerParams > FindAvailableManner( decimal moneyOfPay) 
InBlock.gif                { 
InBlock.gif                         throw  new System.Exception(); 
InBlock.gif                         
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         public  class PaymentResultHandleServiceFactory1 
InBlock.gif        { 
InBlock.gif                 private  static    PaymentResultHandleServiceFactory1() 
InBlock.gif                { 
InBlock.gif                        _serviceMap =  new Dictionary<PaymentManner1, IPaymentResultHandleService1>(); 
InBlock.gif                        _serviceMap.Add(PaymentManner1.PlatformAccount,  new PlatformAccountPaymentResultHandleService1()); 
InBlock.gif                        _serviceMap.Add(PaymentManner1.Yinlian,  new YinlianPaymentResultHandleService1()); 
InBlock.gif                        _serviceMap.Add(PaymentManner1.Zhifubao, new ZhifubaoPaymentResultHandleService1()); 
InBlock.gif                } 
InBlock.gif 
InBlock.gif                 private  static    Dictionary<PaymentManner1 , IPaymentResultHandleService1> _serviceMap; 
InBlock.gif 
InBlock.gif 
InBlock.gif 
InBlock.gif                 public  static IPaymentResultHandleService1 GetService(PaymentManner1 paymentManner ) 
InBlock.gif                { 
InBlock.gif                         return _serviceMap[paymentManner]; 
InBlock.gif                } 
InBlock.gif 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         public  interface IPaymentResultHandleService1 
InBlock.gif        { 
InBlock.gif                 void Handle( string orderSeqNo); 
InBlock.gif        } 
InBlock.gif 
InBlock.gif 
InBlock.gif 
InBlock.gif         public  class ZhifubaoPaymentResultHandleService1:IPaymentResultHandleService1 
InBlock.gif        { 
InBlock.gif                 private OrderRepository1 _orderManagement; 
InBlock.gif                 private ZhifubaoRepository1 _zhifubaoManagement; 
InBlock.gif 
InBlock.gif                 public  void Handle( string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                         using (TransactionScope scope =  new TransactionScope()) 
InBlock.gif                        { 
InBlock.gif                                _orderManagement.UpdateState(); 
InBlock.gif                                 this._zhifubaoManagement.Update(); 
InBlock.gif 
InBlock.gif                                scope.Complete(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif        } 
InBlock.gif         public  class YinlianPaymentResultHandleService1 : IPaymentResultHandleService1 
InBlock.gif        { 
InBlock.gif                 private OrderRepository1 _orderManagement; 
InBlock.gif                 private YinlianRepository1 _yinlianManagement; 
InBlock.gif 
InBlock.gif                 public  void Handle( string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                         using (TransactionScope scope =  new TransactionScope()) 
InBlock.gif                        { 
InBlock.gif                                 this._orderManagement.UpdateState(); 
InBlock.gif                                 this._yinlianManagement.Update();    
InBlock.gif                                 
InBlock.gif                                scope.Complete(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif        } 
InBlock.gif         public  class PlatformAccountPaymentResultHandleService1:IPaymentResultHandleService1    
InBlock.gif        { 
InBlock.gif                 private OrderRepository1 _orderManagement; 
InBlock.gif                 private PlatformAccountRepository1 _platformAccountManagement; 
InBlock.gif 
InBlock.gif                 public  void Handle( string orderSeqNo) 
InBlock.gif                { 
InBlock.gif                         using (TransactionScope scope =  new TransactionScope()) 
InBlock.gif                        { 
InBlock.gif                                 this._orderManagement.UpdateState(); 
InBlock.gif                                 this._platformAccountManagement.Update(); 
InBlock.gif 
InBlock.gif                                scope.Complete(); 
InBlock.gif                        } 
InBlock.gif                } 
InBlock.gif 
InBlock.gif        } 
InBlock.gif         public  class OrderRepository1 
InBlock.gif        { 
InBlock.gif                 public  void UpdateState() 
InBlock.gif                {  throw  new System.Exception(); } 
InBlock.gif        } 
InBlock.gif         public  class PlatformAccountRepository1 
InBlock.gif        { 
InBlock.gif                 public  void Update() 
InBlock.gif                {  throw  new System.Exception(); } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif         public  class ZhifubaoRepository1 
InBlock.gif        { 
InBlock.gif                 public  void Update() 
InBlock.gif                {  throw  new System.Exception(); } 
InBlock.gif        } 
InBlock.gif         public  class YinlianRepository1 
InBlock.gif        { 
InBlock.gif                 public  void Update() 
InBlock.gif                {  throw  new System.Exception(); } 
InBlock.gif        } 
InBlock.gif 
InBlock.gif
 
6总结
类的依赖最好使用抽象,避免具体类的直接引用。
尽量不要再存储过程中处理业务,随着系统越做越大,你会越来越赞同我的说法。原因至少两点:1维护累死人,2数据库不擅长数值计算和处理。
职责单一,功能独立,代码分离。
 
Technorati 标签:  架构演进



本文转自 virusswb 51CTO博客,原文链接:http://blog.51cto.com/virusswb/654907,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
弹性计算 负载均衡 网络协议
弹性计算Clouder认证:高可用应用架构——课时6:如何将云服务器ECS实例绑定到负载均衡?
弹性计算Clouder认证:高可用应用架构——课时6:如何将云服务器ECS实例绑定到负载均衡?
192 0
|
7月前
|
弹性计算
弹性计算Clouder认证:高可用应用架构——课时4:如何将弹性公网IP绑定到云服务器ECS实例?
弹性计算Clouder认证:高可用应用架构——课时4:如何将弹性公网IP绑定到云服务器ECS实例?
258 0
|
11月前
|
存储 SQL 安全
【云计算架构:Dynamics 】 多租户 或多实例 ?
【云计算架构:Dynamics 】 多租户 或多实例 ?
|
11月前
|
机器学习/深度学习 弹性计算 人工智能
阿里云服务器x86、ARM计算、弹性裸金属服务器、超级计算集群实例架构有何不同?
阿里云服务器在架构上有x86计算、ARM 计算架构、异构计算GPU/FPGA/NPU、弹性裸金属服务器(神龙),超级计算集群之分,对于很多新手用户来说,并不清楚这些云服务器实例架构有何不同,不是很了解他们各自有什么特点和适用场景,本文来为大家简单介绍下这些云服务器实例架构的主要特点和适用场景,以供大家参考选择。
581 0
阿里云服务器x86、ARM计算、弹性裸金属服务器、超级计算集群实例架构有何不同?
|
11月前
|
存储 SQL 安全
[云计算架构:Dynamics ] 多租户 或多实例 ?
[云计算架构:Dynamics ] 多租户 或多实例 ?
|
11月前
|
缓存 应用服务中间件 数据库
【系统架构】大型网站系统架构演化实例——使用缓存改善网站性能
【系统架构】大型网站系统架构演化实例——使用缓存改善网站性能
63 0
|
12月前
|
弹性计算 Cloud Native Android开发
阿里云CPU处理器倚天Yitian 710,2.75 GHz主频ECS ARM架构c8y、g8y和g8y实例
阿里云CPU处理器倚天Yitian 710,2.75 GHz主频ECS ARM架构c8y、g8y和g8y实例,阿里云自研CPU处理器倚天Yitian 710,2.75 GHz主频,搭载倚天710处理器的云服务器ECS有计算型c8y、通用型g8y和内存型r8y,云服务器吧分享阿里云自研CPU处理器倚天Yitian 710性能测评:
278 0
|
12月前
|
弹性计算 Cloud Native Android开发
阿里云服务器架构ARM计算c8y、g8y和g8y实例采用倚天Yitian 710
阿里云服务器架构ARM计算c8y、g8y和g8y实例采用倚天Yitian 710,阿里云自研CPU处理器倚天Yitian 710,2.75 GHz主频,搭载倚天710处理器的云服务器ECS有计算型c8y、通用型g8y和内存型g8y,云服务器吧分享阿里云自研CPU处理器倚天Yitian 710性能测评:
196 0
|
12月前
|
弹性计算 编解码 负载均衡
阿里云ECS服务器GPU实例、倚天ARM架构和intel实例价格下调最高47%
阿里云ECS服务器GPU实例、倚天ARM架构和intel实例价格下调最高47%,ecs.c8y/g8y/r8y、ecs.g7/c7/r7、ecs.gn6v、ecs.gn6i阿里云产品大规模调价,核心云产品价格全线下调,技术红利释放核心产品最高降幅50%,以下产品的价格调整将于2023年5月7日生效,最终以产品详情页实际情况为准,阿里云百科分享阿里云官网发布的降价产品及降价幅度说明:
327 0
|
12月前
|
关系型数据库 RDS
MaxScale的老架构RDS实例如何解决跨地域升级问题
MaxScale的老架构RDS实例不支持跨地域备份,怎么解决