বার্নিশটি কোনও নতুন আনতে গিয়ে ক্যাশে থেকে পুরানো ডেটা প্রেরণ করা যাক?


8

আমি গতিশীলভাবে উত্পন্ন পৃষ্ঠাগুলি (পিএইচপি-এফপিএম, এনজিআইএনএক্স) ক্যাশে করছি এবং তাদের সামনে বার্নিশ রেখেছি, এটি খুব ভালভাবে কাজ করে।

তবে একবার ক্যাশের সময়সীমা শেষ হয়ে গেলে আমি এটি দেখতে পেলাম:

  • নতুন ক্লায়েন্ট অনুরোধ পৃষ্ঠা
  • বার্নিশ ক্যাশে সময়সীমা স্বীকৃতি দেয়
  • ক্লায়েন্ট অপেক্ষা
  • বার্নিশ ব্যাকএন্ড থেকে নতুন পৃষ্ঠা এনেছে
  • বার্নিশ ক্লায়েন্টকে নতুন পৃষ্ঠা সরবরাহ করে (এবং পরবর্তী অনুরোধের জন্য এটি তাত্ক্ষণিকভাবে পেলে পৃষ্ঠাকেও ক্যাশে করা হয়েছে)

আমি যা করতে চাই তা হ'ল:

  • ক্লায়েন্ট অনুরোধ পৃষ্ঠা
  • বার্নিশ সময়সীমা স্বীকৃতি দেয়
  • বার্নিশ ক্লায়েন্টকে পুরানো পৃষ্ঠা সরবরাহ করে
  • বার্নিশ ব্যাকএন্ড থেকে নতুন পৃষ্ঠা এনে তা ক্যাশে রাখে into

আমার ক্ষেত্রে এটি এমন সাইট নয় যেখানে পুরানো তথ্য এত বড় সমস্যা, বিশেষত যখন আমরা কয়েক মিনিট থেকে ক্যাশের সময়সীমা নিয়ে কথা বলি না not

তবে, আমি ব্যবহারকারীকে লাইনে অপেক্ষা করার জন্য এবং তাত্ক্ষণিকভাবে কিছু সরবরাহ করার জন্য শাস্তি দিতে চাই না। এটা কি কোনওভাবে সম্ভব?

উদাহরণস্বরূপ, এখানে আমার সার্ভারের বিরুদ্ধে 5 মিনিট অবরোধের একটি নমুনা আউটপুট যা এক মিনিটের জন্য ক্যাশে কনফিগার করা হয়েছিল:

HTTP/1.1,200,  1.97,  12710,/,1,2013-06-24 00:21:06
...
HTTP/1.1,200,  1.88,  12710,/,1,2013-06-24 00:21:20
...
HTTP/1.1,200,  1.93,  12710,/,1,2013-06-24 00:22:08
...
HTTP/1.1,200,  1.89,  12710,/,1,2013-06-24 00:22:22
...
HTTP/1.1,200,  1.94,  12710,/,1,2013-06-24 00:23:10
...
HTTP/1.1,200,  1.91,  12709,/,1,2013-06-24 00:23:23
...
HTTP/1.1,200,  1.93,  12710,/,1,2013-06-24 00:24:12
...

আমি শত শত অনুরোধগুলি চালিয়ে গিয়েছিলাম 0.02or তবে এটি এখনও আমাকে উদ্বেগ করেছে যে তাদের কাঁচা এইচটিএমএল জন্য ব্যবহারকারীদের প্রায় 2 সেকেন্ড অপেক্ষা করতে হবে।

আমরা কি এখানে আরও ভাল কিছু করতে পারি না?

( ক্যাশে থাকাকালীন আমি বার্নিশ প্রেরণে এসে পৌঁছলাম , এটি একইরকম লাগছিল তবে ঠিক আমি যা করার চেষ্টা করছি তা নয়)

সমাধান

শেন ম্যাডেনের উত্তরটিতে সমাধানটি রয়েছে তবে আমি এখনই তা বুঝতে পারি নি। আমার প্রশ্নে আমি আরও একটি বিবরণ অন্তর্ভুক্ত করিনি কারণ আমি ভেবেছিলাম এটি প্রাসঙ্গিক নয়, তবে আসলে এটি।

আমি বর্তমানে যে সিএমএস সলিউশনটি ব্যবহার করছি তাতে একটি বার্নিশ ডাটাবেস শ্রোতা রয়েছে এবং যার পৃষ্ঠাগুলি পরিবর্তিত হয়েছে এমন পৃষ্ঠাগুলি নিষিদ্ধ করার জন্য বার্নিশকে অবহিত করার ক্ষমতা রয়েছে। এটি PURGEনির্দিষ্ট পৃষ্ঠাগুলি নিষিদ্ধ করার জন্য কিছু রেইজেক্সের সাথে একটি অনুরোধ পাঠিয়েছে ।

মোট কথা বলতে গেলে দু'টি ক্ষেত্রেই আমি দুর্ভাগা ব্যবহারকারীদের পেয়েছি:

  1. একটি পৃষ্ঠার স্বাভাবিক বার্নিশ টিটিএল মেয়াদ শেষ হয়
  2. ব্যাকএন্ড ব্যবহারকারীরা সামগ্রী পরিবর্তন করে, এটি বার্নিশের একটি শুদ্ধ অনুরোধ প্রেরণ করে

উভয় ক্ষেত্রেই আমি "দুর্ভাগ্য" ব্যবহারকারী রয়েছি। দ্বিতীয় ক্ষেত্রে এটি সত্য যে ব্যাকএন্ড ব্যবহারকারীরা পৃষ্ঠা পরিবর্তন করার পরে সাধারণত পৃষ্ঠাটি পরীক্ষা করে; তবে অগত্যা নয়।

তবুও, দ্বিতীয় মামলার জন্য আমি একটি সমাধান তৈরি করেছি (হ্যাঁ, আমি বুঝতে পারি যে এই প্রশ্নটি প্রথম মামলার উত্তর ... আমার দিক থেকে খারাপভাবে সূচিত প্রশ্নটির উত্তর চেয়ে শুরু হয়েছিল):

শুদ্ধ অনুরোধ প্রেরণের পরিবর্তে, আমি শেনস পরামর্শটি ব্যবহার করেছি এবং ভিসিএল সামঞ্জস্য করেছি যাতে আমার বার্নিশ ডাটাবেস শ্রোতারা hash_always_missসেট করে একটি পৃষ্ঠা আনার জন্য একটি বিশেষ অনুরোধ প্রেরণ করতে পারে true

বর্তমান স্থাপত্যের সাথে আমার কাছে সত্যিকারের অ্যাসিনক্রোনাস অনুরোধ করার বিলাসিতা সত্যিই নেই, তবে কীভাবে আমি পিএইচপি-তে একটি অ্যাসিনক্রোনাস জিইটি অনুরোধ করব? আমি বার্নিশের জন্য একটি জিইটি অনুরোধটি তৈরি করতে সক্ষম হয়েছি যা পৃষ্ঠাটি লোড হওয়ার জন্য অপেক্ষা করে না তবে পৃষ্ঠপোষক থেকে পৃষ্ঠাটি আনার জন্য বার্নিশটি ট্রিগার করতে এবং এটি ক্যাশে করার পক্ষে যথেষ্ট ভাল।

নেট এফেক্টটি হ'ল ডেটাবেস শ্রোতা বার্নিশকে অনুরোধটি প্রেরণ করেছিলেন এবং আমি নির্দিষ্ট পৃষ্ঠায় ভোট দেওয়ার সময় এটি আমার অনুরোধগুলিকে কখনই "দুর্ভাগ্যকর" করে না তবে বার্নিশটি পৃষ্ঠপোষকটি পুরোপুরি ব্যাকএন্ড থেকে এনেছিল (এটি 300 মিমি থেকে 2 এস পর্যন্ত হতে পারে) এটি হঠাৎ সেখানে ছিল।

সাধারণ টিটিএল শেষ হয়ে গেলে একই সমস্যাগুলি এড়াতে কীভাবে সমাধান করতে হবে তা আমি এখনও সমাধানে পেয়েছি, তবে আমার ধারণা সমাধানটিও ঠিক একই রকম শেনের পরামর্শ অনুসারে: ট্রিগার চালানোর জন্য উইজেট ব্যবহার করে hash_always_miss, আমাকে তালিকা পেতে যথেষ্ট স্মার্ট হতে হবে পৃষ্ঠাগুলি আমি রিফ্রেশ করতে হবে।

উত্তর:


3

এই সমস্যার সমাধান করার জন্য আমি যে সমাধানটি ব্যবহার করেছি সেটি হ'ল এটি নিশ্চিত করা যে কোনও পৃষ্ঠায় থাকা টিটিএল রিফ্রেশ হওয়ার আগেই কখনই মেয়াদ শেষ হওয়ার সুযোগ পাবে না - কোনও এইচটিটিপি ক্লায়েন্টকে দুর্ভাগ্য ক্লায়েন্টের পরিবর্তে ধীর লোড পেতে আমার সিস্টেমে চলতে বাধ্য করা অনুরোধ।

আমার ক্ষেত্রে wgetএটিতে ক্রোন জড়িত রয়েছে, অনুরোধগুলি চিহ্নিত করতে একটি বিশেষ শিরোনাম প্রেরণ এবং এর req.hash_always_missভিত্তিতে সেটিংস স্থাপন করা , সামগ্রীতে একটি নতুন অনুলিপি ক্যাশে আনতে বাধ্য করা।

acl purge {
    "localhost";
}

sub vcl_recv {
    /* other config here */
    if (req.http.X-Varnish-Nuke == "1" && client.ip ~ purge) {
        set req.hash_always_miss = true;
    }
    /* ... */
}

আপনার সামগ্রীর জন্য, এর অর্থ হতে পারে 5 মিনিটের মতো কিছুতে বার্নিশ টিটিএল সেট করা তবে প্রতি মিনিটে ক্যাশে-রিফ্রেশ করার অনুরোধ করার জন্য একটি ক্রোন উইজেট কনফিগার করা উচিত।


আমি মনে করি আপনি কী বলতে চাইছেন তা আমি বুঝতে পেরেছি। এটি একটি পৃষ্ঠার জন্য দুর্দান্ত কাজ করবে, তবে অন্যান্য হাজার হাজার? সেই স্কেলে ক্রোন / উইজেট ব্যবহার করতে পারবেন না।
চিহ্নিত করুন

স্বতঃস্ফূর্তভাবে, আপনাকে কমপক্ষে কোন পৃষ্ঠাগুলি ক্যাশে বর্তমান রাখতে চান তা আপনাকে ঘোষণা করতে হবে। এই তালিকাটি দেওয়া আছে কোনও ক্রোন স্ক্রিপ্টে উইজেট আপনাকে সহায়তা করতে পারে না।
ফ্যালকন মোমোট

আমি মনে করি এটি এই "বার্নিশ বাহ্যিক পদ্ধতির" সাথে চ্যালেঞ্জ। আমি শেষ পর্যন্ত বসে বসে সিদ্ধান্ত নেওয়ার দরকার এবং প্রতিটি পৃষ্ঠার জন্য এটি প্রয়োগ করি implement বার্নিশকে বলার উপায় নেই: "টিটিএল চলে গেল? নতুন সংস্করণ আনবে তবে যতক্ষণ না ঘটে পুরানোটির সেবা করবে" ...? হুম।
চিহ্নিত করুন

4

@EDIT:

আপনাকে কেবল তাড়াতাড়ি জানানোর জন্য যে এই বৈশিষ্ট্যটি সবেমাত্র সর্বাধিক সংস্করণে মাস্টার শাখায় প্রয়োগ করা হয়েছে বলে মনে হয়, আপনার সংস্করণটি সত্যিকারের বাসি-পুনরায় পুনর্নির্মাণের জন্য এখনও সমর্থন করতে পারে না / আমি যে উদাহরণটি পোস্ট করেছি সেগুলি কার্যকর হবে একজন গরীব ব্যাগারের সাথে 9999/10000 টি অনুরোধগুলি এখনও ব্যাকএন্ডে শেষ হওয়ার জন্য অনুরোধের জন্য অপেক্ষা করতে হবে (এখনও কিছু না থেকে ভাল;) ...


ঠিক আছে আমি পূর্ববর্তী মন্তব্যগুলি কেন এটি কাজ করছে না বলে 100% নিশ্চিত তা নয় তবে অনুসারে: https://www.varnish-software.com/static/book/Save_a_request.html

  • req.grace - কোনও বস্তু বার্নিশের জন্য গ্রেস মোডের জন্য বিবেচনা করার জন্য কতক্ষণ ওভারডিউ হতে পারে তা সংজ্ঞায়িত করে।
  • beresp.grace - সংজ্ঞায়িত করে যে be असर.tl-সময় বার্নিশ কোন অবজেক্ট রাখবে।
  • req.grace - প্রায়শই ব্যাকএন্ডের অবস্থার ভিত্তিতে vcl_recv এ পরিবর্তিত হয়।

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

sub vcl_recv {
    # Cache rules above here...
    if (req.backend.healthy) {
        set req.grace = 30d;
    } else {
        set req.grace = 300d;
    }
}

sub vcl_fetch {
    # Fetch rules above here ...

    # If backend returns 500 error then boost the cache grace period...
    if (beresp.status == 500) {
        set beresp.grace = 10h;
        return (restart);
    }

    # How long carnish should keep the objects in cache..
    set beresp.grace = 1h;

    # Actual TTL of cache - If an object is older than this an update will be triggered to the backend server :)
    set beresp.ttl = 1m;
}

মনে রাখবেন যে আপনি যদি দীর্ঘতর ব্যাকএন্ড প্রতিক্রিয়া অনুগ্রহকালীন সময় সরবরাহ করতে চান (আমার কনফিগের মতো 500 টি ত্রুটির জন্য) আপনার ব্যাকএন্ড প্রোব সেটআপ করতে হবে ... আমার ব্যাকএন্ড প্রোবের একটি অনুলিপি এখানে দেওয়া আছে ..

backend default {
    .host = "127.0.0.1";
    .port = "8080";
    .probe = { 
        .url = "/nginx-status";
        .timeout = 500 ms; 
        .interval = 3s; 
        .window = 10;
        .threshold = 4;
    }
}

এটি কি এখনও ভিসিএল ৪.০ এর জন্য বৈধ?
গাদেলকারিম

0

ওয়ার্নিশ 3 এ এটি "গ্রেস মোড" এর মাধ্যমে অর্জন করা হয়েছে। ম্যানুয়াল অনুসারে [1], আপনাকে নিম্নলিখিত যুক্তি যুক্ত করতে হবে:

sub vcl_fetch {
  set beresp.grace = 30m;
} // Makes objects to be cached/stored 30 min beyond its max-age/ttl

sub vcl_recv {
  set req.grace = 60s;
} // Allows varnish to serve objects which expired within last minute.

[1] https://www.varnish-cache.org/docs/3.0/tutorial/ হ্যান্ডলিং_মিসবেহেভিং_সার্ভার্স html#grace-mode


এটি ওপির লক্ষ্য অর্জন করবে না, একজন ক্লায়েন্ট এখনও ব্যাকেন্ড থেকে সামগ্রী আনার জন্য অপেক্ষা করতে বিলম্বিত হবে, যদিও তার পিছনে থাকা অন্য ক্লায়েন্টদের বাসি অনুগ্রহ ফলাফল প্রদান করা হবে। "টিটিএলটির মেয়াদ শেষ হয়ে গেলে, প্রথম ক্লায়েন্ট যা কন্টেন্টের জন্য জিজ্ঞাসা করে তা 15 সেকেন্ডের জন্য আটকে রাখা উচিত, অন্য ক্লায়েন্টকে গ্রেসড কপিটি পাওয়া উচিত।" - বার্নিশ-software.com/static/book/Save_a_request.html
প্যাক্স

দুঃখিত, আমি বুঝতে পারি নি কীভাবে এটি প্রথম মেয়াদোত্তীর্ণ অনুরোধের সাথে আসলে কাজ করে।
নিটান

একটি "ব্যাকগ্রাউন্ড অনুরোধ" ফায়ার জন্য কিছু টিটিএল ঠকাই এবং ইনলাইন সি দিয়ে কাঙ্ক্ষিত লক্ষ্য অর্জন করা যেতে পারে
নিটান
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.