问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

.NET的应用组件

发布网友 发布时间:2022-05-19 09:27

我来回答

2个回答

懂视网 时间:2022-05-19 13:49

前言

在互联网应用中,流量洪峰是常有的事情。在应对流量洪峰时,通用的处理模式一般有排队、限流,这样可以非常直接有效的保护系统,防止系统被打爆。另外,通过限流技术手段,可以让整个系统的运行更加平稳。今天要与大家分享一下限流算法和C#版本的组件。

一、令牌桶算法:

令牌桶算法的基本过程如下:

  • 假如用户配置的平均发送速率为r,则每隔1/r秒速率将一个令牌被加入到桶中;
  • 假设桶最多可以存发b个令牌。当桶中的令牌达到上限后,丢弃令牌。
  • 当一个有请求到达时,首先去令牌桶获取令牌,能够取到,则处理这个请求
  • 如果桶中没有令牌,那么请求排队或者丢弃
  • 工作过程包括3个阶段:产生令牌、消耗令牌和判断数据包是否通过。其中涉及到2个参数:令牌产生的速率和令牌桶的大小,这个过程的具体工作如下。

  • 产生令牌:周期性的以固定速率向令牌桶中增加令牌,桶中的令牌不断增多。如果桶中令牌数已到达上限,则丢弃多余令牌。
  • 消费 令牌:业务程序根据具体业务情况消耗桶中的令牌。消费一次,令牌桶令牌减少一个。
  • 判断是否通过:判断是否已有令牌桶是否存在有效令牌,当桶中的令牌数量可以满足需求时,则继续业务处理,否则将挂起业务,等待令牌。
  • 下面是C#的一个实现方式

    class TokenBucketLimitingService: ILimitingService
     {
     private LimitedQueue<object> limitedQueue = null;
     private CancellationTokenSource cancelToken;
     private Task task = null;
     private int maxTPS;
     private int limitSize;
     private object lckObj = new object();
     public TokenBucketLimitingService(int maxTPS, int limitSize)
     {
     this.limitSize = limitSize;
     this.maxTPS = maxTPS;
    
     if (this.limitSize <= 0)
     this.limitSize = 100;
     if(this.maxTPS <=0)
     this.maxTPS = 1;
    
     limitedQueue = new LimitedQueue<object>(limitSize);
     for (int i = 0; i < limitSize; i++)
     {
     limitedQueue.Enqueue(new object());
     }
     cancelToken = new CancellationTokenSource();
     task = Task.Factory.StartNew(new Action(TokenProcess), cancelToken.Token);
     }
    
     /// <summary>
     /// 定时消息令牌
     /// </summary>
     private void TokenProcess()
     {
     int sleep = 1000 / maxTPS;
     if (sleep == 0)
     sleep = 1;
    
     DateTime start = DateTime.Now;
     while (cancelToken.Token.IsCancellationRequested ==false)
     {
     try
     {
     lock (lckObj)
     {
     limitedQueue.Enqueue(new object());
     }
     }
     catch
     {
     }
     finally
     {
     if (DateTime.Now - start < TimeSpan.FromMilliseconds(sleep))
     {
     int newSleep = sleep - (int)(DateTime.Now - start).TotalMilliseconds;
     if (newSleep > 1)
     Thread.Sleep(newSleep - 1); //做一下时间上的补偿
     }
     start = DateTime.Now;
     }
     }
     }
    
     public void Dispose()
     {
     cancelToken.Cancel();
     }
    
     /// <summary>
     /// 请求令牌
     /// </summary>
     /// <returns>true:获取成功,false:获取失败</returns>
     public bool Request()
     {
     if (limitedQueue.Count <= 0)
     return false;
     lock (lckObj)
     {
     if (limitedQueue.Count <= 0)
     return false;
    
     object data = limitedQueue.Dequeue();
     if (data == null)
     return false;
     }
    
     return true;
     }
     }
    public interface ILimitingService:IDisposable
     {
     /// <summary>
     /// 申请流量处理
     /// </summary>
     /// <returns>true:获取成功,false:获取失败</returns>
     bool Request();
     }
    public class LimitingFactory
     {
     /// <summary>
     /// 创建限流服务对象
     /// </summary>
     /// <param name="limitingType">限流模型</param>
     /// <param name="maxQPS">最大QPS</param>
     /// <param name="limitSize">最大可用票据数</param>
     public static ILimitingService Build(LimitingType limitingType = LimitingType.TokenBucket, int maxQPS = 100, int limitSize = 100)
     {
     switch (limitingType)
     {
     case LimitingType.TokenBucket:
     default:
     return new TokenBucketLimitingService(maxQPS, limitSize);
     case LimitingType.LeakageBucket:
     return new LeakageBucketLimitingService(maxQPS, limitSize);
     }
     }
     }
    
     /// <summary>
     /// 限流模式
     /// </summary>
     public enum LimitingType
     {
     TokenBucket,//令牌桶模式
     LeakageBucket//漏桶模式
     }
    
    public class LimitedQueue<T> : Queue<T>
     {
     private int limit = 0;
     public const string QueueFulled = "TTP-StreamLimiting-1001";
    
     public int Limit
     {
     get { return limit; }
     set { limit = value; }
     }
    
     public LimitedQueue()
     : this(0)
     { }
    
     public LimitedQueue(int limit)
     : base(limit)
     {
     this.Limit = limit;
     }
    
     public new bool Enqueue(T item)
     {
     if (limit > 0 && this.Count >= this.Limit)
     {
     return false;
     }
     base.Enqueue(item);
     return true;
     }
     }

    调用方法:

    var service = LimitingFactory.Build(LimitingType.TokenBucket, 500, 200);
    while (true)
    {
     var result = service.Request();
     //如果返回true,说明可以进行业务处理,否则需要继续等待
     if (result)
     {
     //业务处理......
     }
     else
     Thread.Sleep(1);
    }

    二、漏桶算法

    声明一个固定容量的桶,每接受到一个请求向桶中添加一个令牌,当令牌桶达到上线后请求丢弃或等待,具体算法如下:

  • 创建一个固定容量的漏桶,请求到达时向漏桶添加一个令牌
  • 如果请求添加令牌不成功,请求丢弃或等待
  • 另一个线程以固定的速率消费桶里的令牌
  • 工作过程也包括3个阶段:产生令牌、消耗令牌和判断数据包是否通过。其中涉及到2个参数:令牌自动消费的速率和令牌桶的大小,个过程的具体工作如下。

  • 产生令牌:业务程序根据具体业务情况申请令牌。申请一次,令牌桶令牌加一。如果桶中令牌数已到达上限,则挂起业务后等待令牌。
  • 消费令牌:周期性的以固定速率消费令牌桶中令牌,桶中的令牌不断较少。
  • 判断是否通过:判断是否已有令牌桶是否存在有效令牌,当桶中的令牌数量可以满足需求时,则继续业务处理,否则将挂起业务,等待令牌。
  • C#的一个实现方式:

    class LeakageBucketLimitingService: ILimitingService
     {
     private LimitedQueue<object> limitedQueue = null;
     private CancellationTokenSource cancelToken;
     private Task task = null;
     private int maxTPS;
     private int limitSize;
     private object lckObj = new object();
     public LeakageBucketLimitingService(int maxTPS, int limitSize)
     {
     this.limitSize = limitSize;
     this.maxTPS = maxTPS;
    
     if (this.limitSize <= 0)
     this.limitSize = 100;
     if (this.maxTPS <= 0)
     this.maxTPS = 1;
    
     limitedQueue = new LimitedQueue<object>(limitSize);
     cancelToken = new CancellationTokenSource();
     task = Task.Factory.StartNew(new Action(TokenProcess), cancelToken.Token);
     }
    
     private void TokenProcess()
     {
     int sleep = 1000 / maxTPS;
     if (sleep == 0)
     sleep = 1;
    
     DateTime start = DateTime.Now;
     while (cancelToken.Token.IsCancellationRequested == false)
     {
     try
     {
    
     if (limitedQueue.Count > 0)
     {
     lock (lckObj)
     {
     if (limitedQueue.Count > 0)
      limitedQueue.Dequeue();
     }
     }
     }
     catch
     {
     }
     finally
     {
     if (DateTime.Now - start < TimeSpan.FromMilliseconds(sleep))
     {
     int newSleep = sleep - (int)(DateTime.Now - start).TotalMilliseconds;
     if (newSleep > 1)
     Thread.Sleep(newSleep - 1); //做一下时间上的补偿
     }
     start = DateTime.Now;
     }
     }
     }
    
     public void Dispose()
     {
     cancelToken.Cancel();
     }
    
     public bool Request()
     {
     if (limitedQueue.Count >= limitSize)
     return false;
     lock (lckObj)
     {
     if (limitedQueue.Count >= limitSize)
     return false;
    
     return limitedQueue.Enqueue(new object());
     }
     }
     }

    调用方法:

    var service = LimitingFactory.Build(LimitingType.LeakageBucket, 500, 200);
    while (true)
    {
     var result = service.Request();
     //如果返回true,说明可以进行业务处理,否则需要继续等待
     if (result)
     {
     //业务处理......
     }
     else
     Thread.Sleep(1);
    }

    两类限流算法虽然非常相似,但是还是有些区别的,供大家参考!

    漏桶算法能够强行限制数据的传输速率。在某些情况下,漏桶算法不能够有效地使用网络资源。因为漏桶的漏出速率是固定的。

    令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输.

    总结

    热心网友 时间:2022-05-19 10:57

    Web Services是智能终端软件的基础,微软为用户创建智能终端提供了一整套丰富的解决方案,包括:
    .NET Framework- 智能终端实现跨平台(设备无关性)的
    Visual Studio .NET – 建立并集成Web Services和应用程序的快速开发工具
    Microsoft Windows Server 2003 – 新一代的企业服务器,用于提供建立和发布各种解决方案
    Microsoft Office Professional Edition 2003 – 内建的工具集也能帮助开发智能终端

    Web Services是.NET的核心技术。那什么是Web Services呢?正如Web是新一代的用户与应用交互的途径,XML是新一代的程序之间通讯的途径一样,Web Services是新一代的计算机与计算机之间一种通用的数据传输格式,可让不同运算系统更容易进行数据交换。Web Services有以下几点特性:Web services允许应用之间共享数据;Web services分散了代码单元;基于XML这种internet数据交换的通用语言,实现了跨平台、跨操作系统、跨语言。那微软的ASP和Web services究竟有什么不同呢,ASP仍然是一个集中式计算模型的产物,只不过是披着一层互联网的外衣。但Web Services却是一个迥然不同的精灵,它秉承“软件就是服务”的真言,同时顺应分布式计算模式的潮流。而它的存在形式又与以往软件不同。这种组件模式,小巧、单一,对于开发人员来讲,开发成本较低。
    在这里指出Web services不是微软发明的,同样也不属于微软专有。Web services是一个开放的标准,和HTTP、 XML、SOAP一样。他们是一个工业标准而非微软标准,WS-I是为了促进Web Services互通性的联盟组织,最初是由IBM和微软所发起,其它的成员包括BEA System、惠普计算机(HP)、甲骨文(Oracle)、英特尔(Intel)和SUN 计算机(Sun Microsystem)。如今网络上存在的大多Web services其实没有使用.NET构架,Web services具有互操作属性,你同样可以使用Windows开发客户端来调用运行于Linux上面的Web services的方法。 先前提到的接口规范问题,在.NET中,Web service接口通常使用Web Services Description Language (WSDL)描述。WSDL 使用XML来定义这种接口操作标准及输入输出参数,看起来很像COM和CORBA的接口定义语言(IDLS)Interface Definition Languages。接口定义后就必须使用一些协议调用接口,如SOAP协议,SOAP源于一种叫做XML RPC(XML远程进程调用remote procere calling)的协议,而Java则根据XML-RPC发展了自己的JAX-RPC协议用来调用Web Services。发布和访问Web Services的接口就用到UDDI了,这里我们只需要知道WSDL使用XML定义Web Services接口,通过SOAP访问Web Services,在internet上寻找Web Services使用UDDI就行了。服务器架构——Microsoft Windows Server System Microsoft提供了最佳的服务器构架—Microsoft Windows Server System—便于发布、配置、管理、编排Web Services。为了满足分布式计算的需要微软构造了一系列的服务器系统,这些内建安全技术的系统全部支持XML,这样加速了系统、应用程序以及同样使用Web Services的伙伴应用之间的集成。
    Microsoft Windows Server System包括:
    Microsoft Application Center 2000 - 配置和管理Web应用程序
    Microsoft BizTalk Server 2002 - 建立基于XML的跨应用和组织的商业逻辑
    Microsoft Commerce Server 2002 – 能够迅速建立大规模电子商务的解决方案
    Microsoft Content Management Server 2002 – 管理动态电子商务网站的目录
    Microsoft Exchange Server 2000 – 用于进行随时随地的通讯协作
    Microsoft Host Integration Server 2000 – 用于和主机系统之间传输数据
    Microsoft Internet Security and Acceleration Server 2000 (ISA Server) – internet连接
    Microsoft Mobile Information Server 2002 – 用于支持手持设备
    Microsoft Operations Manager 2000 – 描述企业级解决方案的操作管理
    Microsoft Project Server 2002 - 提供项目管理的最佳方案
    Microsoft SharePoint Portal Server 2001 – 查询、共享、发布商业信息
    Microsoft SQL Server 2000 – 企业级数据库
    Microsoft Visual Studio .NET和Microsoft .NET Framework对于建立,发布并运行Web Services是一个完美的解决方案。
    微软官方的教程。 .NET的初级组成是CIL和CLR。CIL是一套运作环境说明,包括一般系统、基础类库和与机器无关的中间代码,全称为通用中间语言(CIL)。CLR则是确认操作密码符合CIL的平台。在CIL执行前,CLR必须将指令及时编译转换成原始机械码。
    所有CIL(通用中间语言)都可经由.NET自我表述。CLR检查元资料以确保正确的方法被调用。元资料通常是由语言编译器生成的,但开发人员也可以通过使用客户属性创建他们自己的元资料。
    如果一种语言实现生成了CIL,它也可以通过使用CLR被调用,这样它就可以与任何其他.NET语言生成的资料相交互。CLR也被设计为作业系统无关性。
    当一个汇编体被载入时,CLR执行各种各样的测试。其中的两个测试是确认与核查。在确认的时候,CLR检查汇编体是否包含有效的元资料和CIL,并且检查内部表的正确性。核查则不那么精确。核查机制检查代码是否会执行一些“不安全”的操作。核查所使用的演算法非常保守,导致有时一些“安全”的代码也通不过核查。不安全的代码只有在汇编体拥有“跳过核查”许可的情况下才会被执行,通常这意味着代码是安装在本机上的。
    通过.NET,你可以用SOAP和不同的Web services进行交互。

    声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
    巴西龟最长活多久,家养!!! 养胃的药最好的是什么啊 婴儿积食发烧不愿吃药怎么办 板门穴位在哪个部位 手机设置放偷看的方法? 凝结水回收器生产厂家? 个人账户养老金预测公式:现有5万元,缴费20年,能领多少钱? 临沂比较有名的男装品牌 呼伦贝尔市悦动网络科技有限公司怎么样? 呼伦贝尔中汇实业有限公司怎么样? 抗击非典颂扬白衣战士有关的词语? 抗击非典,颂扬白衣战士的词语 在举国上下众志成城抗击“非典”的斗争中,疫情变化牵动着全国人命的心,请根据下列疫情统计表回答问题: “万众一心,众志成城,科学防治,战胜非典”,在全国抗击“非典”的战役中,常用一种医疗上的广谱高效消 - 信息提示 绿色一带一路正在共同打造,绿色一带一路给生活带来什么改变? 2、 目前,低碳时代已经到来。为发展低碳经济,我国提出以下举措:提高... 我国将加快推动绿色低碳发展制定多少年前碳排放达到峰值的行动方案 我国将加快推动绿色低碳发展制定哪年前碳排放达到峰值的行动方案 我国将加快推动绿色低碳发展制定哪一年前碳排放达到峰值的行动方案 我国将加快推动绿色低碳发展,制定什么年前碳排放达到峰值的行动方案... 勇于什么从严管党治党 三严三实专题教育三严指的是 大数据花了可以做美容贷吗 我朋友关机一星期了我怎么也找不到他,能不能帮忙定位他的手机找到他啊?心急死了 我朋友在外地KTV唱歌我怎么可以找到他手机也关机了? 金蝶软件如何打开服务器帐套 立鼎科技岗前培训靠谱么 前几天刚面试了济南佰嘉汇信息科技有限公司的人事,是做外汇的,需要岗前培训6天,靠谱吗?急求! 有人在大连前程科技培训过吗?靠不靠谱 有关抗击非典颂扬白衣战士的成语 梦见在菜园里捡到几副手套 梦见几双白手套,请问是何意? 卡丽丹娜五金饰品厂 有无人知道华南师大的汉语言文学(应用语言学方向)学的是什么? 一位台湾女歌星的歌词有呜呜你听听这什么样的心情,电影不朽的时光里面方紫阳哼哼过它的曲调,嗒嗒哒哒哒 呜呜你还能写出这样词语了吗 谁有钱去弹弹堂30区,我真真真的爱你的,呜呜你去30去把。我叫为什么系人。qq446181021.求你来把 呜呜,你有莫有《师徒殇》伤年已陌,我找了这部小说很久了,就是莫有找到 有关写景或写物的中考满分作文,不少于600字。。呜呜~~拜托了拜托了。。 谁来教教我 哄女朋友开心的话怎么道歉 “呜呜,你居然有起床气,还打人”这是他女朋友的留言。我第一反应是他们同居了。但是我总是抱有侥幸心理 呜呜,你是谁 呜呜,你认不认识我嘛 呜呜呜呜你伤了我的心,呜呜呜呜我还没太在意,就这样爱你爱你爱你 歌名 一个女生在聊天中,谈到一些比如要考试,复习不充分,对你说呜呜是什么意思? 呜呜 你发给我的那些广播剧 不见了 能在给我发一次么!邮箱是756185325@qq.com 麻烦你了 跪求死性不改的手动修改电源管理工具。 WIN7电源管理想改为从不关闭显示器,怎么保存后如果重启电脑,会变回无操作自动关闭