1. مقدمه
Cloud Tasks یک سرویس صف کاملاً مدیریت شده برای مدیریت اجرا، ارسال و تحویل تعداد زیادی کار است.
Cloud Tasks به شما این امکان را میدهد تا تکههای کاری را که وظایف نامیده میشوند، جدا کنید، که میتوانند بهطور مستقل انجام شوند (مثلاً وظیفهای برای بهروزرسانی ورودی پایگاه داده)، خارج از جریان برنامه اصلی خود، و آنها را برای پردازش، بهصورت ناهمزمان، با استفاده از کنترلکنندههایی ارسال کنید که شما ایجاد می کنید
وظیفه بارگذاری شده به یک صف اضافه می شود، که تا زمانی که با موفقیت اجرا شود یا با شکست مواجه شود، کار ادامه دارد. بر اساس پیکربندی، صف همچنین می تواند به عنوان یک کنترل جریان اعزام عمل کند. شما صف را ایجاد و پیکربندی می کنید که سپس توسط سرویس Cloud Tasks مدیریت می شود. هنگامی که وظایف اضافه می شوند، صف وظایف را ارسال می کند و مطمئن می شود که کارگران به طور قابل اعتماد آنها را پردازش می کنند.
برخی از ویژگی های اصلی Cloud Tasks عبارتند از:
- اهداف HTTP: با استفاده از احراز هویت استاندارد صنعتی OAuth/OIDC، وظایفی را با هدف قرار دادن هر سرویس HTTP که در Compute Engine، Google Kubernetes Engine، Cloud Run، Cloud Functions یا سیستمهای درون محل اجرا میشود، هدف قرار دهید.
- تکثیر وظایف : کارهایی که چندین بار اضافه شده اند فقط یک بار ارسال می شوند.
- تحویل تضمینی : کارها حداقل یک بار تضمین می شوند و اکثر کارها دقیقاً یک بار تحویل می شوند.
- کنترلهای نرخ و تلاش مجدد: با تنظیم سرعت ارسال وظایف، حداکثر تعداد تلاشها و حداقل زمان انتظار بین تلاشها، اجرا را کنترل کنید.
- برنامه ریزی آینده: زمان اجرای یک کار را کنترل کنید.
در این کد لبه ابتدا یاد خواهید گرفت که چگونه یک صف معمولی Cloud Tasks برای وظایف HTTP هدف ایجاد و استفاده کنید. سپس، نحوه استفاده از URI HTTP در سطح صف و API جدید BufferTask را برای بافر کردن آسانتر درخواستهای HTTP با وظایف Cloud یاد خواهید گرفت.
چیزی که یاد خواهید گرفت
- نحوه ایجاد وظایف هدف HTTP
- نحوه ایجاد وظایف هدف HTTP با URI جدید HTTP در سطح صف.
- نحوه تغییر وظایف معلق با URI جدید HTTP در سطح صف.
- چگونه با API جدید BufferTask، درخواستهای HTTP را راحتتر بافر کنیم.
2. راه اندازی و الزامات
تنظیم محیط خود به خود
- به Google Cloud Console وارد شوید و یک پروژه جدید ایجاد کنید یا از یک موجود استفاده مجدد کنید. اگر قبلاً یک حساب Gmail یا Google Workspace ندارید، باید یک حساب ایجاد کنید .
- نام پروژه نام نمایشی برای شرکت کنندگان این پروژه است. این یک رشته کاراکتری است که توسط API های Google استفاده نمی شود. همیشه می توانید آن را به روز کنید.
- شناسه پروژه در تمام پروژههای Google Cloud منحصربهفرد است و تغییرناپذیر است (پس از تنظیم نمیتوان آن را تغییر داد). Cloud Console به طور خودکار یک رشته منحصر به فرد تولید می کند. معمولاً برای شما مهم نیست که چیست. در اکثر کدها، باید شناسه پروژه خود را ارجاع دهید (معمولاً با نام
PROJECT_ID
شناخته می شود). اگر شناسه تولید شده را دوست ندارید، ممکن است یک شناسه تصادفی دیگر ایجاد کنید. از طرف دیگر، میتوانید خودتان را امتحان کنید، و ببینید آیا در دسترس است یا خیر. پس از این مرحله نمی توان آن را تغییر داد و در طول مدت پروژه باقی می ماند. - برای اطلاع شما، یک مقدار سوم وجود دارد، یک شماره پروژه ، که برخی از API ها از آن استفاده می کنند. در مورد هر سه این مقادیر در مستندات بیشتر بیاموزید.
- در مرحله بعد، برای استفاده از منابع Cloud/APIها باید صورتحساب را در کنسول Cloud فعال کنید . اجرا کردن از طریق این کد لبه هزینه زیادی نخواهد داشت. برای خاموش کردن منابع برای جلوگیری از تحمیل صورتحساب فراتر از این آموزش، میتوانید منابعی را که ایجاد کردهاید حذف کنید یا پروژه را حذف کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان 300 دلاری هستند.
Cloud Shell را راه اندازی کنید
در حالی که Google Cloud را می توان از راه دور از لپ تاپ شما کار کرد، در این کد لبه از Google Cloud Shell استفاده خواهید کرد، یک محیط خط فرمان که در Cloud اجرا می شود.
از Google Cloud Console ، روی نماد Cloud Shell در نوار ابزار بالا سمت راست کلیک کنید:
تهیه و اتصال به محیط فقط چند لحظه طول می کشد. وقتی تمام شد، باید چیزی شبیه به این را ببینید:
این ماشین مجازی با تمام ابزارهای توسعه که شما نیاز دارید بارگذاری شده است. این یک فهرست اصلی 5 گیگابایتی دائمی را ارائه می دهد و در Google Cloud اجرا می شود و عملکرد و احراز هویت شبکه را تا حد زیادی افزایش می دهد. تمام کارهای شما در این کد لبه را می توان در یک مرورگر انجام داد. شما نیازی به نصب چیزی ندارید.
3. یک صف منظم برای وظایف HTTP هدف ایجاد کنید
در این مرحله اول، یاد خواهید گرفت که چگونه یک صف معمولی Cloud Tasks ایجاد کنید و وظایف HTTP را به آن اضافه کنید تا یک سرویس Cloud Run را هدف قرار دهید.
وظایف هدف HTTP چیست؟
وظایف هدف HTTP میتواند هر سرویس HTTP را که در Compute Engine، Google Kubernetes Engine، Cloud Run، Cloud Functions یا سیستمهای درون محل اجرا میشود، با استفاده از احراز هویت استاندارد OAuth/OIDC به روشی امن مورد هدف قرار دهد.
یک سرویس Cloud Run را مستقر کنید
ابتدا مطمئن شوید که API های مورد نیاز فعال هستند:
gcloud services enable \ cloudtasks.googleapis.com \ run.googleapis.com
یک سرویس Cloud Run را مستقر کنید که به عنوان هدف وظایف HTTP عمل می کند:
SERVICE1=hello1 REGION=us-central1 gcloud run deploy $SERVICE1 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
یک صف Cloud Tasks ایجاد کنید
یک صف معمولی Cloud Tasks ایجاد کنید:
QUEUE1=http-queue LOCATION=us-central1 gcloud tasks queues create $QUEUE1 --location=$LOCATION
صف را موقتاً متوقف کنید تا بتوانید وظایف HTTP را هنگام ایجاد مشاهده کنید:
gcloud tasks queues pause $QUEUE1 --location=$LOCATION
4. ایجاد و تست یک کار HTTP
در این مرحله، یک کار HTTP برای هدف قرار دادن صفی که قبلا ایجاد کرده اید ایجاد می کنید.
یک کار HTTP ایجاد کنید
می توانید وظایف HTTP را با استفاده از gcloud
ایجاد کنید:
gcloud tasks create-http-task \ --queue=$QUEUE1 \ --location=$LOCATION \ --url=$SERVICE1_URL \ --method=GET
اختیاری: همچنین می توانید یک کار HTTP با کتابخانه های سرویس گیرنده ایجاد کنید. به عنوان مثال، می توانید Program.cs
را برای نمونه C# بررسی کنید که در آن یک درخواست HTTP در یک Task
و یک TaskRequest
قبل از ارسال به Cloud Tasks با یک CloudTasksClient
پیچیده می شود:
var taskRequest = new CreateTaskRequest { Parent = new QueueName(projectId, location, queue).ToString(), Task = new Task { HttpRequest = new HttpRequest { HttpMethod = HttpMethod.Get, Url = url } } }; var client = CloudTasksClient.Create(); var response = client.CreateTask(taskRequest);
برای ایجاد و اضافه کردن وظیفه به صف می توانید آن را به صورت زیر اجرا کنید:
dotnet run $PROJECT_ID $LOCATION $QUEUE1 $SERVICE1_URL
وظیفه HTTP را تست کنید
در این مرحله، وظیفه ایجاد می شود اما هنوز اجرا نشده است، زیرا صف متوقف شده است. شما می توانید این را با لیست کردن صف ها تأیید کنید:
gcloud tasks queues list --location=$LOCATION
باید صف را در حالت PAUSED
ببینید:
QUEUE_NAME STATE http-queue PAUSED
از سرگیری صف:
gcloud tasks queues resume $QUEUE --location=$LOCATION
گزارش های سرویس Cloud Run را بررسی کنید:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1
باید ببینید که سرویس Cloud Run یک درخواست HTTP GET از Cloud Tasks دریافت کرده است:
httpRequest: latency: 0.227597158s protocol: HTTP/1.1 remoteIp: 35.243.23.192 requestMethod: GET requestSize: '415' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.32.53 status: 200 userAgent: Google-Cloud-Tasks
5. یک صف با پیکربندی مسیریابی ایجاد کنید
در این مرحله، نحوه ایجاد یک صف Cloud Tasks با پیکربندی مسیریابی برای اضافه کردن یک URI HTTP با استفاده از ویژگی پیکربندی Task Routing در سطح صف ایجاد میکنید. سپس وظایف HTTP را به آن اضافه میکنید تا اولین سرویس Cloud Run را هدف قرار دهید و مشاهده کنید که پیکربندی مسیریابی URI را لغو میکند تا وظایف را به دومین سرویس Cloud Run هدایت کند.
پیکربندی مسیریابی وظیفه در سطح صف چیست؟
پیکربندی مسیریابی وظیفه در سطح صف، مسیریابی وظایف HTTP را برای کل صف برای همه کارهای معلق و جدید تغییر می دهد. این امکان ایجاد آسانتر وظایف را فراهم میکند زیرا هدف HTTP نیازی به تنظیم در سطح کار نیست و کنترل بیشتری را به ارائهدهنده سرویس منتقل میکند زیرا آنها میتوانند هدف تمام وظایف را در یک صف تنظیم کنند (مثلاً ترافیک را به یک باطن دیگر هدایت کنند). اگر باطن اصلی خراب باشد).
پیکربندی زیر را می توان در سطح صف تنظیم کرد:
- سرصفحه ها : سرصفحه های سطح صف زمانی که در سطح صف مشخص می شوند، سرصفحه ها را برای تمام وظایف موجود در صف اضافه می کنند.
- روش HTTP : وقتی روش HTTP در سطح صف مشخص شود، روش HTTP را برای همه وظایف موجود در صف لغو می کند.
- URI هدف : میزبان، مسیر، پرس و جو، پورت، طرح (HTTP یا HTTPS) را می توان به صورت جداگانه لغو کرد.
- مجوز : پیکربندی OIDC/OAuth وقتی در سطح صف مشخص شود، پیکربندی OIDC/OAuth در سطح کار را لغو می کند.
دومین سرویس Cloud Run را راه اندازی کنید
دومین سرویس Cloud Run را مستقر کنید که بعداً به عنوان هدف لغو URI HTTP عمل می کند:
SERVICE2=hello2 REGION=us-central1 gcloud run deploy $SERVICE2 \ --allow-unauthenticated \ --image=gcr.io/cloudrun/hello \ --region=$REGION
میزبان URL سرویس را برای بعد ذخیره کنید:
SERVICE2_URL=$(gcloud run services describe $SERVICE2 --region $REGION --format 'value(status.url)') SERVICE2_HOST=$(echo $SERVICE2_URL | sed 's,http[s]*://,,g')
یک صف Cloud Tasks با پیکربندی مسیریابی ایجاد کنید
یک صف با پیکربندی مسیریابی با لغو HTTP URI به دومین سرویس Cloud Run ایجاد کنید.
QUEUE2=http-queue-uri-override gcloud beta tasks queues create $QUEUE2 \ --http-uri-override=host:$SERVICE2_HOST \ --location=$LOCATION
توجه داشته باشید که لغو URI به دومین سرویس Cloud Run اشاره دارد. هر کار HTTP اضافه شده به صف میزبان URI اصلی آن لغو می شود. می توانید پیکربندی صف را ببینید:
gcloud beta tasks queues describe $QUEUE2 --location=$LOCATION
باید ببینید که httpTarget
دارای یک uriOverride
است که به میزبان سرویس دوم اشاره می کند:
httpTarget: uriOverride: host: hello2-idcwffc3yq-uc.a.run.app pathOverride: {} queryOverride: {} ...
صف را موقتاً متوقف کنید تا بتوانید وظایف HTTP را هنگام ایجاد مشاهده کنید:
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
6. یک کار HTTP برای صف با پیکربندی مسیریابی ایجاد و آزمایش کنید
در این مرحله، یک کار HTTP برای هدف قرار دادن سرویس اول ایجاد میکنید و مشاهده میکنید که URI آن توسط صف برای اشاره به سرویس دوم لغو میشود.
یک کار HTTP ایجاد کنید
یک کار HTTP با URL اولین سرویس ایجاد کنید:
gcloud tasks create-http-task \ --queue=$QUEUE2 \ --location=$LOCATION \ --url=$SERVICE1_URL \ --method=GET
وظیفه HTTP را تست کنید
از سرگیری صف:
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
باید ببینید که سرویس Cloud Run دوم (نه اولین) یک درخواست HTTP GET از Cloud Tasks به دلیل نادیده گرفتن دریافت کرد:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE2" --limit 1
--- httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello2-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
7. وظایف معلق را با پیکربندی مسیریابی تغییر دهید
همچنین میتوانید از پیکربندی مسیریابی برای تغییر HTTP URI همه کارهای معلق در یک صف استفاده کنید. اگر سرویس Backend از کار بیفتد و بخواهید به سرعت به سرویس دیگری بروید، مفید است. بیایید ببینیم که در این مرحله چگونه کار می کند.
دوباره صف را مکث کنید:
gcloud tasks queues pause $QUEUE2 --location=$LOCATION
یک کار HTTP با google.com
به عنوان URL کار ایجاد کنید:
gcloud tasks create-http-task \ --queue=$QUEUE2 \ --location=$LOCATION \ --url=https://www.google.com \ --method=GET
کار در حالت معلق است زیرا صف متوقف شده است.
اکنون، URI HTTP را بهروزرسانی کنید تا به اولین سرویس اشاره کند. با این کار میزبان وظیفه معلق از google.com
به میزبان سرویس اول لغو می شود:
SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)') SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g') gcloud beta tasks queues update $QUEUE2 \ --http-uri-override=host:$SERVICE1_HOST \ --location=$LOCATION
از سرگیری صف:
gcloud tasks queues resume $QUEUE2 --location=$LOCATION
باید ببینید که اولین سرویس Cloud Run یک درخواست HTTP GET از Cloud Tasks به دلیل لغو (به جای google.com
) دریافت کرد:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 1 --- httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
8. یک صف برای BufferTask API ایجاد کنید
به طور معمول، شما با استفاده از Tasks API یا از کتابخانه های سرویس گیرنده gcloud
یا Tasks، کارها را ایجاد می کنید. این کار باعث می شود تا برنامه ها با استفاده از کتابخانه های سرویس گیرنده، درخواست های HTTP را در Tasks بپیچند و همچنین وابستگی بین برنامه ها و کتابخانه های سرویس گیرنده Tasks ایجاد می کند.
در این مرحله، میبینید که چگونه میتوانید از مزایای URI HTTP در سطح صف و API جدید BufferTask برای ایجاد آسانتر وظایف هدف HTTP با ارسال یک درخواست HTTP استفاده کنید. هر برنامهای که بتواند درخواستهای HTTP ارسال کند، اکنون میتواند وظایف هدف HTTP ایجاد کند.
BufferTask API چیست؟
CreateTask API روش قدیمی ایجاد Tasks است و مشتری را ملزم می کند که یک شی Task را با تمام فیلدهای مورد نیاز به API ارسال کند.
BufferTask API یک ویژگی جدید است که به کاربران امکان می دهد بدون نیاز به ارائه هیچ گونه پیکربندی وظیفه (URL HTTP، سرصفحه ها، مجوز) یک کار HTTP ایجاد کنند و به شما این امکان را می دهد که به سادگی یک پیام یا متن درخواست خود را به Buffer API ارسال کنید.
این امر ادغام آسانتر با سرویسها را امکانپذیر میکند، زیرا اکنون میتوان Cloud Tasks را در مقابل سرویس شما بدون نیاز به تغییر کد در سمت سرویس گیرنده مستقر کرد. هر درخواست HTTP دلخواه ارسال شده به BufferTask API به عنوان یک شی Task پیچیده می شود و به مقصد تعیین شده در سطح صف تحویل داده می شود.
برای استفاده از BufferTask API، صف باید دارای تنظیمات Target URI باشد، یا به عبارت دیگر، ویژگی Routing Configuration در سطح صف ، پیش نیاز استفاده از BufferTask API است.
یک صف Cloud Tasks با پیکربندی مسیریابی ایجاد کنید
یک صف با پیکربندی مسیریابی ایجاد کنید که به اولین سرویسی که در مرحله قبل مستقر کردیم اشاره می کند:
SERVICE1=hello1 SERVICE1_URL=$(gcloud run services describe $SERVICE1 --region $REGION --format 'value(status.url)') SERVICE1_HOST=$(echo $SERVICE1_URL | sed 's,http[s]*://,,g') QUEUE3=http-queue-uri-override-buffer gcloud beta tasks queues create $QUEUE3 \ --http-uri-override=host:$SERVICE1_HOST \ --location=$LOCATION
صف را موقتاً متوقف کنید تا بتوانید وظایف HTTP را هنگام ایجاد مشاهده کنید:
gcloud tasks queues pause $QUEUE3 --location=$LOCATION
9. بافر درخواست های HTTP با BufferTask API
در این مرحله، درخواست های ساده HTTP GET یا POST را با BufferTask API بافر می کنید. زیر پوششها، Cloud Tasks این درخواستهای HTTP را با تنظیمات پیکربندی مسیریابی پیشفرض صف در وظایف HTTP قرار میدهد.
ابتدا وارد شوید تا یک نشانه دسترسی دریافت کنید و چند متغیر را تنظیم کنید:
gcloud auth application-default login ACCESS_TOKEN=$(gcloud auth application-default print-access-token) PROJECT_ID=$(gcloud config get-value project) TASKS_QUEUES_API="https://cloudtasks.googleapis.com/v2beta3/projects/$PROJECT_ID/locations/$LOCATION/queues"
یک کار HTTP ایجاد کنید
یک کار HTTP با BufferTask API ایجاد کنید. توجه کنید که چگونه یک درخواست HTTP GET ساده بدون نیاز به ایجاد یک Task است:
curl -X GET "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \ -H "Authorization: Bearer $ACCESS_TOKEN"
یک کار HTTP دیگر با HTTP POST و بدنه ایجاد کنید:
curl -X POST "$TASKS_QUEUES_API/$QUEUE3/tasks:buffer" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -d "{'message': 'Hello World'}"
اختیاری: همچنین می توانید یک کار HTTP با کتابخانه های سرویس گیرنده ایجاد کنید. به عنوان مثال، میتوانید Program.cs
برای نمونه C# بررسی کنید که در آن درخواست HTTP GET مستقیماً به BufferTask API ارسال میشود، بدون اینکه آن را در یک Task
بپیچید یا نیازی به کلاینت-کتابخانه برای وظایف Cloud داشته باشید:
var BufferTaskApiUrl = $"https://cloudtasks.googleapis.com/v2beta3/projects/{ProjectId}/locations/{Location}/queues/{Queue}/tasks:buffer"; using (var client = new HttpClient()) { client.DefaultRequestHeaders.Add("Authorization", $"Bearer {AccessToken}"); var response = await client.GetAsync(BufferTaskApiUrl); var content = await response.Content.ReadAsStringAsync(); Console.WriteLine($"Response: {content}"); }
می توانید آن را به صورت زیر اجرا کنید:
dotnet run $PROJECT_ID $LOCATION $QUEUE3 $ACCESS_TOKEN
BufferTask API از ایجاد یک Task از درخواست های HTTP مراقبت می کند و URL را از تنظیمات پیکربندی مسیریابی صف برای URI اضافه می کند.
وظیفه HTTP را تست کنید
از سرگیری صف:
gcloud tasks queues resume $QUEUE3 --location=$LOCATION
باید ببینید که سرویس Cloud Run یک درخواست HTTP GET و POST از Cloud Tasks دریافت کرده است:
gcloud logging read "resource.type=cloud_run_revision AND resource.labels.service_name=$SERVICE1" --limit 4
--- httpRequest: latency: 0.002279292s protocol: HTTP/1.1 remoteIp: 35.243.23.42 requestMethod: POST requestSize: '777' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5450' serverIp: 216.239.32.53 status: 200 userAgent: Google-Cloud-Tasks ... httpRequest: latency: 0.228982142s protocol: HTTP/1.1 remoteIp: 35.187.132.84 requestMethod: GET requestSize: '426' requestUrl: https://hello1-idcwffc3yq-uc.a.run.app/ responseSize: '5510' serverIp: 216.239.34.53 status: 200 userAgent: Google-Cloud-Tasks
10. تبریک می گویم
تبریک می گویم، شما نرم افزار کد را تمام کردید!
در ادامه، میتوانید Cloud Tasks را بهعنوان یک بافر بین Pub/Sub و Cloud Run امتحان کنید تا نمونهای در دنیای واقعی ببینید که چگونه این ویژگیهای جدید Cloud Tasks میتواند به ایجاد آسان صف بافر بین سرویسها کمک کند.
پاکسازی (اختیاری)
برای جلوگیری از تحمیل هزینه، ایده خوبی است که منابع را تمیز کنید.
اگر به پروژه نیاز ندارید، می توانید به سادگی پروژه را حذف کنید:
gcloud projects delete $PROJECT_ID
اگر به پروژه نیاز دارید، می توانید منابع را به صورت جداگانه حذف کنید.
سرویس های Cloud Run را حذف کنید:
gcloud run services delete $SERVICE1 --region $REGION gcloud run services delete $SERVICE2 --region $REGION
صف های Cloud Tasks را حذف کنید:
gcloud tasks queues delete $QUEUE1 --location=$LOCATION gcloud tasks queues delete $QUEUE2 --location=$LOCATION gcloud tasks queues delete $QUEUE3 --location=$LOCATION
آنچه را پوشش داده ایم
- نحوه ایجاد وظایف هدف HTTP
- نحوه ایجاد وظایف هدف HTTP با URI جدید HTTP در سطح صف.
- نحوه تغییر وظایف معلق با URI جدید HTTP در سطح صف.
- چگونه با API جدید BufferTask، درخواستهای HTTP را راحتتر بافر کنیم.