দীর্ঘ-চলমান সংযোগ
সার্ভার-প্রেরিত ইভেন্টস (এসএসই) একটি দীর্ঘ-চলমান এইচটিটিপি সংযোগ **, তাই শুরু করার জন্য আমাদের এটির প্রয়োজন:
proxy_http_version 1.1;
proxy_set_header Connection "";
দ্রষ্টব্য: HTTP / 1.1 এ টিসিপি সংযোগগুলি ডিফল্টরূপে স্থির থাকে, সুতরাং সংযোগ শিরোনামটি খালি সেট করা সঠিক জিনিসটি করে এবং এটি Nginx পরামর্শ।
খণ্ডিত স্থানান্তর-এনকোডিং
এখন একদিকে; এসএসই প্রতিক্রিয়াগুলি কোনও সামগ্রী-দৈর্ঘ্যের শিরোনাম সেট করে না কারণ তারা জানতে পারবেন না যে কতগুলি ডেটা প্রেরণ করা হবে, পরিবর্তে তাদের ট্রান্সফার-এনকোডিং শিরোনাম [0] [1] ব্যবহার করা দরকার, কী স্ট্রিমিং সংযোগের জন্য অনুমতি দেয়। এছাড়াও নোট করুন: আপনি যদি কোনও সামগ্রী-দৈর্ঘ্য যোগ না করেন তবে বেশিরভাগ HTTP সার্ভার Transfer-Encoding: chunked;
আপনার জন্য সেট করবে। আশ্চর্যের বিষয় হল, এইচটিটিপি চিংকিং বিরুদ্ধে সতর্ক করেছে এবং বিভ্রান্তির সৃষ্টি করে।
এই বিভ্রান্তি ডাব্লু 3 ইভেন্টসোর্সের বিবরণীর নোটস বিভাগে কিছুটা অস্পষ্ট সতর্কবার্তা থেকে উদ্ভূত:
লেখকরাও সতর্ক হন যে এইচটিটিপি চুনকিং এই প্রোটোকলের নির্ভরযোগ্যতার উপর অপ্রত্যাশিত নেতিবাচক প্রভাব ফেলতে পারে। যেখানেই সম্ভব, ইভেন্ট স্ট্রিম পরিবেশন করার জন্য ছানিং অক্ষম করা উচিত যদি না বার্তাগুলির হার যথেষ্ট না হয় তবে এটিকে গুরুত্ব দেওয়া উচিত নয়।
কোনটি বিশ্বাস করতে নেতৃত্ব দেবে Transfer-Encoding: chunked;
তা এসএসইর পক্ষে খারাপ কাজ। তবে: এটি অগত্যা ঘটনাটি নয়, কেবল তখনই সমস্যা হয় যখন আপনার ওয়েবসার্ভার আপনার জন্য কাজ করে চলেছে (আপনার ডেটা সম্পর্কে তথ্য না জেনে)। সুতরাং, বেশিরভাগ পোস্টগুলি পরামর্শ দিবে যে chunked_transfer_encoding off;
এটি সাধারণ ক্ষেত্রে [3] এর জন্য প্রয়োজনীয় নয়।
বাফারিং (আসল সমস্যা)
যেখানে বেশিরভাগ সমস্যা থেকেই আসে অ্যাপ অ্যাপ্লিকেশন সার্ভার এবং ক্লায়েন্টের মধ্যে যে কোনও ধরণের বাফারিং। ডিফল্টরূপে [৪], এনগিনেক্স ব্যবহার করে
proxy_buffering on
( আপনার অ্যাপ্লিকেশনটি দেখে uwsgi_buffering
এবং তার fastcgi_buffering
উপর নির্ভর করে) এবং আপনি আপনার ক্লায়েন্টের কাছে বেরিয়ে আসতে চাইলে বাছাই করতে পারেন। এটি একটি খারাপ জিনিস কারণ এসএসইয়ের রিয়েলটাইম প্রকৃতি ভেঙে যায়।
তবে, proxy_buffering off
সমস্ত কিছুর দিকে ঘুরার পরিবর্তে, X-Accel-Buffering: no
কেবলমাত্র এসএসই ভিত্তিক প্রতিক্রিয়ার জন্য বাফারিং বন্ধ করতে এবং আপনার অ্যাপ্লিকেশন থেকে আসা সমস্ত প্রতিক্রিয়াগুলির জন্য নয়, আপনার অ্যাপ্লিকেশন সার্ভার কোডটিতে রেসপন্স শিরোনাম হিসাবে যুক্ত করা ভাল (যদি আপনি সক্ষম হয়ে থাকেন) best সার্ভার। বোনাস: এটি uwsgi
এবং এর জন্যও কাজ করবে fastcgi
।
সমাধান
এবং তাই সত্যই গুরুত্বপূর্ণ সেটিংস হ'ল অ্যাপ-সার্ভারের প্রতিক্রিয়া শিরোনাম:
Content-Type: text/event-stream;
Cache-Control: no-cache;
X-Accel-Buffering: no;
এবং সম্ভাব্যভাবে কিছু পিং প্রক্রিয়া প্রয়োগ করা যাতে সংযোগটি খুব বেশি সময় অলস না থাকে। এর বিপদটি হ'ল এনগিনেক্স keepalive
সেটিংটি ব্যবহার করে অলস সংযোগগুলি বন্ধ করে দেবে ।
[0] https://tools.ietf.org/html/rfc2616#section-3.6
[1] https://en.wikedia.org/wiki/Chunked_transfer_encoding
[2] https://www.w3.org/TR / 2009 / ডাব্লুডি-ইভেন্টসোর্স -20091029 / # পাঠ্য-ইভেন্ট-স্ট্রিম
[3] https://github.com/phawg/html/issues/515
[4] http://nginx.org/en/docs/http/ এনজিএক্স_এইচটিপি_প্রক্সি_মডিউল এইচটিএমএল # প্রক্সি_বফারিং
[5] https://tools.ietf.org/html/rfc7230#section-6.3
[6] https://gist.github.com/CMCDragonkai/6bfade6431e9ffb7fe88