none
windows azure发现重大问题 RRS feed

  • 问题

  • 我是想原先在asp.net中用Application对像实现统计访问量的功能,现在用云端的代码实现,

    页面的代码如下:
    CloudBlobContainer objContainer = GetContainer("mytxtcontainer");
                    CloudBlob cb = objContainer.GetBlockBlobReference("mytext");
                   string num = "0";
                   try
                   {
                       num = cb.DownloadText();
                       num = Convert.ToString(int.Parse(num) + 1);
                     
                   }
                   catch (Exception)
                   {
                     
                   }
                   cb.UploadText(num);

        Response.Write(cb.DownloadText());


    当我最后用Response.Write(cb.DownloadText());后,发现结果累加了两次,比如,原先第一次在try中调用cb.DownloadText()时,取出来的值为1,经过后面的cb.UploadText后,再执行Response.Write那一句后,发现值变为3,为何?本来我要的结果是2,但显示出来的结果却为3




    2011年7月2日 7:33

答案

  • Hi 云端程序员,

    你要考虑网站被多个用户同时访问的问题. 比如在cb.UploadText(num);与Response.Write(cb.DownloadText());两行代码之间, 有可能另外一个用户也访问了这个网站, 然后又累加了一次. 累加的次数多了, 是这些代码被调用了多次.

    但是我认为你这个方法反而会遇到另外个问题, 有时候2个或更多用户同时访问, 却累才加了1次. 原因是这段代码没做并发性的考虑, 比如2个用户同时访问网站, 同时调用num = cb.DownloadText();取得相同的值, 然后又各自调用cb.UploadText(num);上传了累加了1之后的值, 这时候, 2个用户同时访问, 却才累加了1.

    以其于在Blob Storage里取出数值, 相加, 然后存回去, 我更加推荐每次在Table Storage里插入一条数据, 然后统计下Table Storage里有几条数据就知道访问量了. 这样可以解决并发性问题, 因为再多的用户同时访问, 他/她们都会各自在Table Storage里插入一条数据, 大家互不影响.


    Wengchao Zeng
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    2011年7月4日 2:26

全部回复

  • cb.DownloadText();
    你调用了2次啊
    Frank Xu Lei--谦卑若愚,好学若饥
    专注于.NET平台下分布式应用系统开发和企业应用系统集成
    Focus on Distributed Applications Development and EAI based on .NET
     

    老徐的网站】:http://www.frankxulei.com/

    微软WCF中文技术论坛
    微软WCF英文技术论坛

    Windows Azure中文技术论坛

    2011年7月2日 8:18
    版主
  • cb.DownloadText()这个调用两次没错,但为何结果会累加两次?
    2011年7月3日 2:52
  • 如果你用兩個 client 測試的話,確實有可能發生。

    建議使用 SQL Azure 去記錄,或是把數值更新的演算法再做嚴格一點 (ex: IP-based)。


    小朱的技術隨手寫:http://www.dotblogs.com.tw/regionbbs/
    雲端學堂Facebook: http://www.facebook.com/pages/StudyAzurecom-yun-duan-xue-tang/155855707799579
    2011年7月3日 16:37
  • Hi 云端程序员,

    你要考虑网站被多个用户同时访问的问题. 比如在cb.UploadText(num);与Response.Write(cb.DownloadText());两行代码之间, 有可能另外一个用户也访问了这个网站, 然后又累加了一次. 累加的次数多了, 是这些代码被调用了多次.

    但是我认为你这个方法反而会遇到另外个问题, 有时候2个或更多用户同时访问, 却累才加了1次. 原因是这段代码没做并发性的考虑, 比如2个用户同时访问网站, 同时调用num = cb.DownloadText();取得相同的值, 然后又各自调用cb.UploadText(num);上传了累加了1之后的值, 这时候, 2个用户同时访问, 却才累加了1.

    以其于在Blob Storage里取出数值, 相加, 然后存回去, 我更加推荐每次在Table Storage里插入一条数据, 然后统计下Table Storage里有几条数据就知道访问量了. 这样可以解决并发性问题, 因为再多的用户同时访问, 他/她们都会各自在Table Storage里插入一条数据, 大家互不影响.


    Wengchao Zeng
    Please mark the replies as answers if they help or unmark if not.
    If you have any feedback about my replies, please contact msdnmg@microsoft.com.
    Microsoft One Code Framework
    2011年7月4日 2:26