首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Azure存储BufferManager是做什么的,以及如何/何时实现它?

Azure存储BufferManager是做什么的,以及如何/何时实现它?
EN

Stack Overflow用户
提问于 2017-01-14 23:41:42
回答 1查看 434关注 0票数 0

有关MSDN for cloudBlobClient.BufferManager的文档描述了此缓冲区管理器提高了高规模应用程序的性能。

我的理解是,这个缓冲区管理器减少了许多小型事务(如许多Azure Table实体调用中所显示的)对GC的压力,

然后,我阅读了有关桌面使用的参考资料,桌面/移动使用配置文件似乎不太可能遇到GC碎片:

IBufferManager接口以System.ServiceModel.dll中的BufferManager类为模板,允许桌面客户端轻松地利用框架提供的现有实现。

问题

  1. IBufferManager的唯一目的是降低GC的压力吗?
  2. 哪些工作负载(表、队列、Blob)将从这个缓存中受益?
  3. 我应该实现IBufferManager的(可测量的)条件是什么?
  4. BufferManager线程安全吗?我可以根据需要分配一个运行时服务器端缓冲池吗?
  5. 我应该如何实现这个bufferManager?(例如线程、IDisposable、静态方法中的预分配、Redis)
EN

回答 1

Stack Overflow用户

发布于 2017-01-18 07:17:31

@LamonteCristo,这些都是好问题。

IBufferManager的唯一目的是降低GC的压力吗?

BufferManager不仅可以减少对GC的压力,而且可以提高存储服务器的性能。GC可以创建和销毁缓冲池,这些过程是计算机资源上每一次分配的成本。BufferManager可以保持缓冲池,而且每次都比GC快。同时,我建议您可以参考这个答案

哪些工作负载(表、队列、Blob)将从这个缓存中受益?

答案是肯定的。Azure存储SDK为这3种存储服务提供了此功能。它们都是同样的方法。

我应该实现IBufferManager的(可测量的)条件是什么?

从理论上讲,我们可以使用不同的MaxBufferSize发出并发请求,以获得服务器响应时间。然后再次发送这些请求以获得响应时间。我们可以比较这两种响应时间。事实上,这是时间和记忆之间的平衡。

BufferManager线程安全吗?我可以根据需要分配一个运行时服务器端缓冲池吗?

根据我的经验,如果我们在多个线程中使用同一个实例,那么线程是不安全的。请参阅本文件(https://msdn.microsoft.com/en-us/library/system.servicemodel.channels.buffermanager(v=vs.110).aspx#Thread)

我应该如何实现这个bufferManager?(例如线程、IDisposable、静态方法中的预分配、Redis)

您需要在项目中实现"System.ServiceModel“,并尝试使用以下示例:

代码语言:javascript
复制
public class WCFBufferManagerAdapter : IBufferManager
{
    private int defaultBufferSize = 0;

    public WCFBufferManagerAdapter(BufferManager manager, int defaultBufferSize)
    {
        this.Manager = manager;
        this.defaultBufferSize = defaultBufferSize;
    }

    public BufferManager Manager { get; internal set; }

    public void ReturnBuffer(byte[] buffer)
    {
        this.Manager.ReturnBuffer(buffer);
    }

    public byte[] TakeBuffer(int bufferSize)
    {
        return this.Manager.TakeBuffer(bufferSize);
    }

    public int GetDefaultBufferSize()
    {
        return this.defaultBufferSize;
    }
}

然后您可以如下所示地使用这个BufferManager:

代码语言:javascript
复制
StorageCredentials credentials = new StorageCredentials("**", "**");
            CloudBlobClient serviceClient = new CloudBlobClient(new Uri("**"), credentials);             
            BufferManager mgr = BufferManager.CreateBufferManager(<you_can_set>, <you_can_set>);            
            serviceClient.BufferManager = new WCFBufferManagerAdapter(mgr, <you_can_set>);
            serviceClient.GetContainerReference("**");

如果您想使用多线程,您可能需要在代码中使用“锁”。如果有任何问题,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41656223

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档