এএসপি.নেট এমভিসিতে অনুরোধ থ্রোটলিং বাস্তবায়নের সর্বোত্তম উপায়?


212

আমরা নির্দিষ্ট সময়ের মধ্যে ব্যবহারকারীর ক্রিয়াগুলি থ্রোট করার জন্য বিভিন্ন উপায়ে পরীক্ষা করছি :

  • প্রশ্ন / উত্তর পোস্ট সীমাবদ্ধ
  • সম্পাদনা সীমাবদ্ধ করুন
  • ফিড পুনরুদ্ধার সীমাবদ্ধ

আপাতত আমরা ব্যবহারকারীর ক্রিয়াকলাপের রেকর্ড সন্নিবেশ করতে ক্যাশেটি ব্যবহার করছি - যদি সেই রেকর্ডটি উপস্থিত থাকে যদি / যখন ব্যবহারকারী একই ক্রিয়াকলাপটি করে, আমরা থ্রটল্ট করি।

ক্যাশে ব্যবহার করে স্বয়ংক্রিয়ভাবে আমাদের বাসি ডেটা পরিষ্কার এবং ব্যবহারকারীদের ক্রিয়াকলাপ উইন্ডো সরবরাহ করা হয় তবে কীভাবে এটি স্কেল হবে তা সমস্যা হতে পারে।

অনুরোধগুলি / ব্যবহারকারীর ক্রিয়াগুলি কার্যকরভাবে থ্রোল্ট করা যায় (স্থিরতার উপর জোর দেওয়া) তা নিশ্চিত করার আরও কয়েকটি উপায় কী?


আপনি কি প্রতি ব্যবহারকারী বা প্রতি প্রশ্ন সীমাবদ্ধ করার চেষ্টা করছেন? যদি প্রতি ব্যবহারকারী, সেশন ব্যবহার করতে পারে, যা একটি ছোট সেট হবে।
গ্রেগ ওগল

1
এটি ব্যবহারকারীর প্রতি, তবে আমরা সেশনটি ব্যবহার করতে পারিনি, কারণ এতে কুকিজ দরকার - আমরা বর্তমানে আইপি ঠিকানার ভিত্তিতে সীমাবদ্ধ করছি।
টেকনোলজি ডিক্সন

1
আজকাল, এমভিসি পৃষ্ঠাগুলির জন্য গিথুব // স্টেফানপ্রোডেন / এমভিসি থ্রোটল এবং ওয়েব এপিআই অনুরোধগুলির জন্য গিথুব / স্টেস্টফ্যানপ্রোডন / ওয়েবেএপি ট্রটল বিবেচনা করুন
অ্যান্ডি

উত্তর:


240

আমরা গত এক বছর ধরে স্ট্যাক ওভারফ্লোতে যা ব্যবহার করছি তার জেনেরিক সংস্করণ এখানে রয়েছে:

/// <summary>
/// Decorates any MVC route that needs to have client requests limited by time.
/// </summary>
/// <remarks>
/// Uses the current System.Web.Caching.Cache to store each client request to the decorated route.
/// </remarks>
[AttributeUsage(AttributeTargets.Method, AllowMultiple = false)]
public class ThrottleAttribute : ActionFilterAttribute
{
    /// <summary>
    /// A unique name for this Throttle.
    /// </summary>
    /// <remarks>
    /// We'll be inserting a Cache record based on this name and client IP, e.g. "Name-192.168.0.1"
    /// </remarks>
    public string Name { get; set; }

    /// <summary>
    /// The number of seconds clients must wait before executing this decorated route again.
    /// </summary>
    public int Seconds { get; set; }

    /// <summary>
    /// A text message that will be sent to the client upon throttling.  You can include the token {n} to
    /// show this.Seconds in the message, e.g. "Wait {n} seconds before trying again".
    /// </summary>
    public string Message { get; set; }

    public override void OnActionExecuting(ActionExecutingContext c)
    {
        var key = string.Concat(Name, "-", c.HttpContext.Request.UserHostAddress);
        var allowExecute = false;

        if (HttpRuntime.Cache[key] == null)
        {
            HttpRuntime.Cache.Add(key,
                true, // is this the smallest data we can have?
                null, // no dependencies
                DateTime.Now.AddSeconds(Seconds), // absolute expiration
                Cache.NoSlidingExpiration,
                CacheItemPriority.Low,
                null); // no callback

            allowExecute = true;
        }

        if (!allowExecute)
        {
            if (String.IsNullOrEmpty(Message))
                Message = "You may only perform this action every {n} seconds.";

            c.Result = new ContentResult { Content = Message.Replace("{n}", Seconds.ToString()) };
            // see 409 - http://www.w3.org/Protocols/rfc2616/rfc2616-sec10.html
            c.HttpContext.Response.StatusCode = (int)HttpStatusCode.Conflict;
        }
    }
}

নমুনা ব্যবহার:

[Throttle(Name="TestThrottle", Message = "You must wait {n} seconds before accessing this url again.", Seconds = 5)]
public ActionResult TestThrottle()
{
    return Content("TestThrottle executed");
}

এএসপি.এনইটি ক্যাশে এখানে চ্যাম্পের মতো কাজ করে - এটি ব্যবহার করে আপনি আপনার থ্রটল এন্ট্রিগুলিতে স্বয়ংক্রিয়ভাবে ক্লিন-আপ পাবেন। এবং আমাদের ক্রমবর্ধমান ট্র্যাফিকের সাথে আমরা এটি দেখতে পাচ্ছি না যে এটি সার্ভারে একটি সমস্যা।

এই পদ্ধতিতে মতামত জানাতে নির্দ্বিধায়; যখন আমরা স্ট্যাক ওভারফ্লো আরও ভাল করি তখন আপনি আপনার ইওক আরও দ্রুত বাড়িয়ে তুলবেন :)


5
তাত্ক্ষণিক প্রশ্ন - আপনি কীটির অংশ হিসাবে c.HttpContext.Request.UserHostAdress মান ব্যবহার করছেন। এই মানটি কি খালি বা নাল বা একই মান একই? (যেমন, যদি আপনি কোনও লোড ব্যালেন্সার ব্যবহার করেন এবং এটি সেই মেশিনের আইপি .. আসল ক্লায়েন্ট নয়) যেমন, প্রক্সি বা লোড ব্যালেন্সারগুলি করুন (অর্থাত্ একটি বিআইপি আইপি এফ 5) সেখানে একই তথ্য রাখুন এবং আপনাকে পরীক্ষা করতে হবে এক্স ফরওয়ার্ড-জন্যও বা অন্য কিছু?
বিশুদ্ধ.ক্রোম

7
@ খাঁটি.ক্রোম - হ্যাঁ, এটি হতে পারে। যখন ক্লায়েন্ট IP পুনরুদ্ধারের, আমরা যে চেক উভয় একটি সাহায্যকারী ফাংশন ব্যবহার REMOTE_ADDRএবং HTTP_X_FORWARDED_FORসার্ভার ভেরিয়েবল এবং sanitizes উপযুক্তভাবে।
টেকনোলজি ডিক্সন

3
@ ব্র্যাটরোবি, আমি নিশ্চিত যে তাদের আইপি ঠিকানার ভিত্তিতে সার্ভারের সখ্যতা রয়েছে। সুতরাং তারা সম্ভবত এখনও একই সার্ভার হিট করা হবে।
এমএমসিডোল

4
আপনারা যারা যত্ন করেন এবং এগুলি মন্তব্য স্ট্রিমে পড়েছেন ... আমরা আমাদের নিজস্ব পুনর্নির্দেশগুলি লিখেছিলাম যা পুনর্নির্দেশের আগে থ্রোটল ক্যাশে কী সাফ করে। এইভাবে সমস্ত পুনর্নির্দেশগুলি কীটি সরাতে কোডের মধ্য দিয়ে যায় এবং এগুলির কোনওটিই থ্রটল বৈশিষ্ট্যটিকে ট্রিগার করে না।
স্লোরেট

4
আপনি যদি এটির
পাপা

68

মাইক্রোসফ্টের আইআইএস 7 এর জন্য একটি নতুন এক্সটেনশন রয়েছে যা আইআইএস 7.0 - বিটার জন্য ডায়নামিক আইপি নিষেধাজ্ঞার এক্সটেনশন বলে।

"আইআইএস .0.০ এর জন্য ডায়নামিক আইপি নিষেধাজ্ঞাগুলি একটি মডিউল যা ওয়েব সার্ভার এবং ওয়েব সাইটগুলিতে পরিষেবা অস্বীকার এবং বর্বর বাহিনীর আক্রমণ থেকে সুরক্ষা সরবরাহ করে Such বা যারা স্বল্প সময়ের মধ্যে বিপুল সংখ্যক অনুরোধ করে "। http://learn.iis.net/page.aspx/548/using-dynamic-ip-restrictions/

উদাহরণ:

আপনি যদি ব্লক করার জন্য মানদণ্ড সেট করে থাকেন X requests in Y millisecondsবা X concurrent connections in Y millisecondsআইপি ঠিকানাটি ব্লক হয়ে যায় Y millisecondsতবে অনুরোধগুলি আবার অনুমোদিত হবে।


1
গুগলবটের মতো ক্রলারগুলির সাথে এটি কোনও সমস্যা সৃষ্টি করেছে কিনা আপনি কি জানেন?
হেলিফ্যান্ট


1
এটি এখন সংস্করণ 8 অনুসারে আইআইএস-এর সাথে প্রকাশিত এবং বান্ডিল হয়েছে - iis.net/learn/get-st সূত্র
ম্যাথিউ

আমি এটি ব্যবহার করতে চাই, তবে এটি আপনাকে এলোমেলোভাবে অনুমতি দেয় না <location>। এটি অ্যাপের জন্য প্রতিটি অনুরোধ বা কোনওটি নয় none
ক্যাসি স্পিকম্যান

আপনার ওয়েব সার্ভারগুলি কোনও লোড ব্যালান্সারের পিছনে থাকলে কার্যকর হবে বলে মনে হয় না, কারণ সমস্ত ট্র্যাফিক একই আইপি ঠিকানা থেকে প্রদর্শিত হবে। যতক্ষণ না আমি স্পষ্ট কিছু মিস করছি ...
Dscoduc

11

আমরা এই ইউআরএল http://www.codeproject.com/KB/aspnet/10ASPNetPerformance.aspx থেকে ধার করা কৌশলটি ব্যবহার করি , থ্রোটলিংয়ের জন্য নয়, তবে কোনও দরিদ্র ব্যক্তির পরিষেবা (ডস) অস্বীকার করার জন্য। এটিও ক্যাশে-ভিত্তিক এবং আপনি যা করছেন তার মতো হতে পারে। আপনি কি ডস আক্রমণ প্রতিরোধ করতে থ্রটল করছেন? ডসকে হ্রাস করতে অবশ্যই রাউটারগুলি ব্যবহার করা যেতে পারে; আপনি কি মনে করেন যে কোনও রাউটার আপনার প্রয়োজনীয় থ্রটলিং পরিচালনা করতে পারে?


1
এটি আমরা ইতিমধ্যে যা করছি তা বেশ বেশি - তবে এটি দুর্দান্ত কাজ করছে :)
জারোদ ডিকসন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.