All
ফিল্টার দ্বারা:
আমি কিভাবে আমার অ্যাকাউন্টে নগদ জমা করব?
আমার অ্যাকাউন্ট যাচাইকরণের জন্য সাহায্য দরকার।
আমি কেন আমার অ্যাকাউন্টে প্রবেশ করতে পারছি না?
কোনো ক্রিপ্টো তোলার ফি আছে কি?
আমি আমার অ্যাকাউন্টে সাইন ইন করতে সাহায্য চাই।
আমাদের WebSocket API v1 আমাদের মার্কেট ডেটার (টিকর, অর্ডার বুক, সময় ও বিক্রয় ইত্যাদি) একটি স্থায়ী উৎস সরবরাহ করার উদ্দেশ্যে তৈরি করা হয়েছে, কিন্তু কখনও কখনও WebSocket সংযোগগুলি Cloudflare দ্বারা অপ্রত্যাশিতভাবে বন্ধ হয়ে যায়।
Cloudflare দ্বারা শুরু হওয়া সংযোগ বিচ্ছিন্নতা সাধারণত নেটওয়ার্কিং ত্রুটির কারণ হয়, যেমন নিম্নলিখিত 1006 ত্রুটি:
Error reading from websocket: close 1006 (abnormal closure): unexpected EOF
অথবা নিম্নলিখিত ক্ষেত্রে যেখানে Python একটি ইতিমধ্যে বন্ধ সংযোগ থেকে একটি নতুন মার্কেট ডেটা বার্তা পড়ার চেষ্টা করার সময় একটি ব্যতিক্রম (exception) ছুঁড়ে দেয়:
websocket._exceptions.WebSocketConnectionClosedException: socket is already closed
যদিও এই ধরনের অপ্রত্যাশিত সংযোগ বিচ্ছিন্নতা রোধ করার কোনো সমাধান নেই, তবে কিছু অত্যন্ত কার্যকর বিকল্প উপায় রয়েছে। যদি আপনি ঘন ঘন WebSocket সংযোগ বিচ্ছিন্নতার সম্মুখীন হন, তাহলে আমরা নিম্নলিখিতগুলির মধ্যে এক বা একাধিক বাস্তবায়নের সুপারিশ করি:
Cloudflare-এর নিরাপত্তা সতর্কতা প্রায়শই নির্দিষ্ট IP ঠিকানা, একই ধরনের IP ঠিকানার গ্রুপ (যেমন একটি ক্লাস C ব্লক) বা নির্দিষ্ট ভৌগোলিক অবস্থানে প্রয়োগ করা হয়, তাই আপনার IP ঠিকানা পরিবর্তন করা কখনও কখনও একটি সহজ কিন্তু কার্যকর সমাধান।
উদাহরণস্বরূপ, আপনার API সফটওয়্যার একটি ভিন্ন AWS অঞ্চলে হোস্ট করা বা একটি ভিন্ন ভৌগোলিক অবস্থানে একটি VPN ব্যবহার করা উভয়ই স্থানীয় IP ঠিকানাকে উল্লেখযোগ্যভাবে পরিবর্তন করবে এবং সম্ভাব্যভাবে অপ্রত্যাশিত সংযোগ বিচ্ছিন্নতার সমস্যা সমাধান করবে।
একটি একক WebSocket সংযোগ ব্যবহার করা যা কোনো অনিচ্ছাকৃত সংযোগ বিচ্ছিন্নতার জন্য পর্যবেক্ষণ করা হয় এবং প্রয়োজন অনুযায়ী পুনরায় সংযুক্ত ও পুনরায় সাবস্ক্রাইব করা হয়, এটি আরেকটি সহজ কিন্তু কার্যকর সমাধান। নিম্নলিখিতটি একটি মৌলিক উদাহরণ Python কোড যা দেখায় কিভাবে একটি WebSocketConnectionClosed ব্যতিক্রম (exception) ছুঁড়ে দেওয়া হলে একটি WebSocket সংযোগ পুনরায় সংযুক্ত এবং পুনরায় সাবস্ক্রাইব করতে হয়:
#!/usr/bin/env python3 import sys from websocket import create_connection ws = create_connection('wss://ws.kraken.com/') print(ws.recv()) ws.send('{"event":"subscribe", "subscription":{"name":"ticker"}, "pair":["XBT/USD"]}') print(ws.recv()) for count in range(100): if count == 30 or count == 60: ws.close() try: print(ws.recv()) except: ws = create_connection('wss://ws.kraken.com/') print(ws.recv()) ws.send('{"event":"subscribe", "subscription":{"name":"ticker"}, "pair":["XBT/USD"]}') print(ws.recv()) ws.close() sys.exit(0)
নিম্নলিখিত নমুনা আউটপুটে দেখানো হয়েছে, যখনই সংযোগ অপ্রত্যাশিতভাবে বন্ধ হয়ে যায় (লুপের 30 এবং 60 পুনরাবৃত্তিতে) তখনই WebSocket সংযোগ এবং সাবস্ক্রিপশন নবায়ন করা হয়:
{"connectionID":8986307948074364287,"event":"systemStatus","status":"online","version":"1.0.1"} {"channelID":274,"channelName":"ticker","event":"subscriptionStatus","pair":"XBT/USD","status":"subscribed","subscription":{"name":"ticker"}} [274,{"a":["9766.00000",16,"16.15314657"],"b":["9765.90000",16,"16.06793017"],"c":["9766.00000","0.15407543"],"v":["934.89117067","6431.35804307"],"p":["9793.82728","9736.03263"],"t":[3442,18738],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.80000"]},"ticker","XBT/USD"] {"event":"heartbeat"} ... [274,{"a":["9766.00000",15,"15.80052495"],"b":["9765.90000",15,"15.09399036"],"c":["9766.00000","0.18958527"],"v":["935.24379229","6430.73154248"],"p":["9793.81679","9736.04572"],"t":[3444,18738],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] [274,{"a":["9766.00000",15,"15.59644495"],"b":["9765.90000",15,"15.09399036"],"c":["9766.00000","0.20408000"],"v":["935.44787229","6430.93562248"],"p":["9793.81072","9736.04667"],"t":[3445,18739],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] {"event":"heartbeat"} [274,{"a":["9766.00000",11,"11.59644495"],"b":["9765.90000",20,"20.24943617"],"c":["9766.00000","4.00000000"],"v":["939.44787229","6434.93562248"],"p":["9793.69231","9736.06529"],"t":[3446,18740],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] {"connectionID":14767302623274336124,"event":"systemStatus","status":"online","version":"1.0.1"} {"channelID":274,"channelName":"ticker","event":"subscriptionStatus","pair":"XBT/USD","status":"subscribed","subscription":{"name":"ticker"}} [274,{"a":["9766.00000",11,"11.59644495"],"b":["9765.90000",20,"20.24943617"],"c":["9766.00000","4.00000000"],"v":["939.44787229","6434.93562248"],"p":["9793.69231","9736.06529"],"t":[3446,18740],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] [274,{"a":["9766.00000",8,"8.49644495"],"b":["9765.90000",21,"21.50083276"],"c":["9766.00000","1.50355505"],"v":["942.54787229","6438.03562248"],"p":["9793.60123","9736.07971"],"t":[3448,18742],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] {"event":"heartbeat"} {"event":"heartbeat"} [274,{"a":["9766.00000",4,"4.19644495"],"b":["9765.90000",22,"22.67116661"],"c":["9766.00000","4.30000000"],"v":["946.84787229","6442.33562248"],"p":["9793.47588","9736.09968"],"t":[3449,18743],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] ... {"event":"heartbeat"} {"connectionID":11355575731659611126,"event":"systemStatus","status":"online","version":"1.0.1"} {"channelID":274,"channelName":"ticker","event":"subscriptionStatus","pair":"XBT/USD","status":"subscribed","subscription":{"name":"ticker"}} [274,{"a":["9766.00000",4,"4.00000071"],"b":["9765.90000",21,"21.97845481"],"c":["9766.00000","0.19644424"],"v":["947.04431653","6442.53206672"],"p":["9793.47018","9736.10059"],"t":[3450,18744],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] [274,{"a":["9766.00000",3,"3.85443405"],"b":["9765.90000",19,"19.69673762"],"c":["9766.00000","0.14556666"],"v":["947.18988319","6442.67763338"],"p":["9793.46596","9736.10127"],"t":[3451,18745],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] {"event":"heartbeat"} {"event":"heartbeat"} [274,{"a":["9766.00000",3,"3.51109438"],"b":["9765.90000",19,"19.69673762"],"c":["9766.00000","0.16647855"],"v":["947.53322286","6443.02097305"],"p":["9793.45601","9736.10286"],"t":[3453,18747],"l":["9731.30000","9465.00000"],"h":["9845.00000","9884.70000"],"o":["9792.10000","9660.70000"]},"ticker","XBT/USD"] ...
একাধিক (দুই বা ততোধিক) রিডানড্যান্ট WebSocket সংযোগ ব্যবহার করা সাধারণত অপ্রত্যাশিত WebSocket সংযোগ বিচ্ছিন্নতার সবচেয়ে কার্যকর সমাধান, কারণ এটি অন্তর্নিহিত সংযোগগুলি কত ঘন ঘন বন্ধ হয় তা নির্বিশেষে মার্কেট ডেটা ফিডগুলিকে নিরবচ্ছিন্নভাবে চালিয়ে যেতে দেয়।
নিম্নলিখিত মৌলিক উদাহরণ Python কোড দেখায় কিভাবে স্বয়ংক্রিয় ফেইলওভার সহ একাধিক WebSocket সংযোগ বাস্তবায়ন করতে হয়:
#!/usr/bin/env python3 import sys from websocket import create_connection ws = [ None, None ] data = [ "", "" ] ws[0] = create_connection("wss://ws.kraken.com/") print("WebSocket (Primary): %s" % ws[0].recv()) ws[1] = create_connection("wss://ws.kraken.com/") print("WebSocket (Backup): %s" % ws[1].recv()) ws[0].send('{"event":"subscribe", "subscription":{"name":"spread"}, "pair":["XBT/USD"]}') print("WebSocket (Primary): %s" % ws[0].recv()) ws[1].send('{"event":"subscribe", "subscription":{"name":"spread"}, "pair":["XBT/USD"]}') print("WebSocket (Backup): %s" % ws[1].recv()) source = 0 for count in range(100): try: try: data[0] = ws[0].recv() except Exception: source = 1 try: data[1] = ws[1].recv() except Exception: source = 0 except KeyboardInterrupt: ws[0].close() print("WebSocket (%(source)s): %(data)s" % {"source":"Primary" if source == 0 else "Backup", "data":data[source]}) ws[source].close() sys.exit(1)
উপরের কোডটি দুটি WebSocket সংযোগ তৈরি করে এবং উভয় সংযোগকে একই মার্কেট ডেটা ফিডে সাবস্ক্রাইব করে। প্রাথমিক সংযোগটি মার্কেট ডেটা আউটপুট করতে ব্যবহৃত হয়, যতক্ষণ না একটি কীবোর্ড ইন্টারাপ্ট তৈরি হয় (উদাহরণস্বরূপ, Ctrl+C এর মাধ্যমে), যা প্রাথমিক সংযোগটি বন্ধ করে দেয়। প্রাথমিক সংযোগ থেকে পরবর্তী রিডগুলি একটি ব্যতিক্রম (exception) ছুঁড়ে দেয়, যা ধরা হয় এবং মার্কেট ডেটা উৎসকে ব্যাকআপ সংযোগে পরিবর্তন করতে ব্যবহৃত হয়, যা তখন মার্কেট ডেটা আউটপুট করতে ব্যবহৃত হয়।
নিম্নলিখিত নমুনা আউটপুট দেখায় কিভাবে মার্কেট ডেটা ফিডকে বাধা না দিয়ে মার্কেট ডেটা উৎস প্রাথমিক সংযোগ থেকে ব্যাকআপ সংযোগে পরিবর্তিত হয়:
WebSocket (Primary): {"connectionID":6894434610526943167,"event":"systemStatus","status":"online","version":"1.0.1"} WebSocket (Backup): {"connectionID":11520162761468018366,"event":"systemStatus","status":"online","version":"1.0.1"} WebSocket (Primary): {"channelID":275,"channelName":"spread","event":"subscriptionStatus","pair":"XBT/USD","status":"subscribed","subscription":{"name":"spread"}} WebSocket (Backup): {"channelID":275,"channelName":"spread","event":"subscriptionStatus","pair":"XBT/USD","status":"subscribed","subscription":{"name":"spread"}} WebSocket (Primary): [275,["9674.90000","9675.00000","1591440118.120752","10.88476562","3.47935600"],"spread","XBT/USD"] WebSocket (Primary): {"event":"heartbeat"} WebSocket (Primary): {"event":"heartbeat"} WebSocket (Primary): [275,["9674.90000","9675.00000","1591440127.108830","10.98812533","3.47935600"],"spread","XBT/USD"] WebSocket (Primary): {"event":"heartbeat"} WebSocket (Primary): [275,["9674.90000","9675.00000","1591440129.406073","1.87412533","7.47935600"],"spread","XBT/USD"] WebSocket (Primary): [275,["9674.90000","9675.00000","1591440129.505372","0.77412533","7.47935600"],"spread","XBT/USD"] WebSocket (Primary): [275,["9674.90000","9675.00000","1591440129.572658","0.10335971","7.47935600"],"spread","XBT/USD"] WebSocket (Primary): [275,["9674.90000","9675.00000","1591440129.572658","0.10335971","7.47935600"],"spread","XBT/USD"] ^C WebSocket (Backup): [275,["9674.90000","9675.00000","1591440130.156840","0.10335971","8.27935600"],"spread","XBT/USD"] WebSocket (Backup): [275,["9674.90000","9675.00000","1591440130.195899","0.10335971","8.47435600"],"spread","XBT/USD"] WebSocket (Backup): [275,["9673.80000","9675.00000","1591440130.459388","0.10335971","8.47435600"],"spread","XBT/USD"] WebSocket (Backup): [275,["9672.60000","9675.00000","1591440130.195899","0.00516924","8.47435600"],"spread","XBT/USD"] WebSocket (Backup): [275,["9673.80000","9675.00000","1591440130.764856","0.00400000","8.47435600"],"spread","XBT/USD"] WebSocket (Backup): [275,["9673.80000","9674.90000","1591440130.780514","0.00400000","0.25000000"],"spread","XBT/USD"] WebSocket (Backup): {"event":"heartbeat"} WebSocket (Backup): [275,["9673.80000","9674.90000","1591440132.433940","4.00400000","0.25000000"],"spread","XBT/USD"] WebSocket (Backup): [275,["9673.80000","9674.90000","1591440132.519509","4.00000000","0.25000000"],"spread","XBT/USD"] WebSocket (Backup): [275,["9673.90000","9674.90000","1591440132.527887","0.10336612","0.25000000"],"spread","XBT/USD"] WebSocket (Backup): [275,["9673.90000","9675.00000","1591440132.527887","0.10336612","4.27935600"],"spread","XBT/USD"]
উল্লেখ্য যে রিডানড্যান্ট WebSocket সংযোগগুলি তিনটি সমাধানের মধ্যে সবচেয়ে জটিল, তবে নির্ভরযোগ্যতার দিক থেকে এটি সর্বোত্তম সমাধান।