র্যাক মিডলওয়্যার কী?


265

রবিতে র্যাক মিডলওয়্যার কী? "মিডওয়্যারের" দ্বারা তারা কী বোঝায় তার কোনও ভাল ব্যাখ্যা আমি পাইনি।


4
মিডলওয়্যার সহ র্যাকসকে এখন ব্যাপকভাবে কভার করার জন্য একটি গাইড রয়েছে: গাইডস
রেলস_অন_র্যাক

ফিউশনপ্যাসেঞ্জার টিমকে অনেক ধন্যবাদ, তাদের ব্লগে তাদের একটি সুন্দরভাবে ব্যাখ্যা করা নিবন্ধ রয়েছে। rubyraptor.org/…
লামিয়ান

রাক এবং র্যাক মিডলওয়্যার এই নিবন্ধে ব্যাখ্যা করা হয়েছে । একটি র্যাক ভিত্তিক অ্যাপ্লিকেশন তৈরি সম্পর্কেও ব্যাখ্যা করেছেন।
শাশ্বত শ্রীবাস্তব

উত্তর:


352

নকশা হিসাবে রাক

র্যাক মিডলওয়্যারটি "একটি অনুরোধ এবং প্রতিক্রিয়া ফিল্টার করার উপায়" এর চেয়ে বেশি - এটি র্যাক ব্যবহার করে ওয়েব সার্ভারগুলির জন্য পাইপলাইন ডিজাইন প্যাটার্নের একটি বাস্তবায়ন ।

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

উদাহরণস্বরূপ র্যাকের সাথে আমি পাইপলাইন করার পৃথক পর্যায় থাকতে পারি:

  • প্রমাণীকরণ : যখন অনুরোধ আসে, ব্যবহারকারীগণ লগইন বিশদ সঠিক? এই ওআউথ, এইচটিটিপি বেসিক অথেনটিকেশন, নাম / পাসওয়ার্ডকে আমি কীভাবে যাচাই করব?

  • অনুমোদন : "ব্যবহারকারী কি এই বিশেষ কাজটি সম্পাদনের জন্য অনুমোদিত?", অর্থাৎ ভূমিকা-ভিত্তিক সুরক্ষা।

  • ক্যাশিং : আমি কি এই অনুরোধটি ইতিমধ্যে প্রক্রিয়া করেছি, আমি কি ক্যাশেড ফলাফল দিতে পারি?

  • সজ্জা : ডাউনস্ট্রিম প্রসেসিং আরও ভাল করার জন্য আমি কীভাবে অনুরোধটি বাড়িয়ে তুলতে পারি?

  • পারফরম্যান্স এবং ব্যবহার নিরীক্ষণ : অনুরোধ এবং প্রতিক্রিয়া থেকে আমি কোন পরিসংখ্যান পেতে পারি?

  • সম্পাদন : আসলে অনুরোধটি পরিচালনা করুন এবং প্রতিক্রিয়া সরবরাহ করুন।

বিভিন্ন স্টেজে আলাদা করতে সক্ষম হওয়া (এবং optionচ্ছিকভাবে সেগুলি অন্তর্ভুক্ত করা) ভাল কাঠামোগত অ্যাপ্লিকেশনগুলির বিকাশে একটি দুর্দান্ত সহায়তা।

সম্প্রদায়

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

মিডলওয়্যার কী?

মিডলওয়্যার একটি ভয়ঙ্কর শব্দ যা কোনও সফ্টওয়্যার উপাদান / গ্রন্থাগারকে বোঝায় যা সহায়তা করে তবে কোনও কার্য সম্পাদনে সরাসরি জড়িত থাকে না। খুব সাধারণ উদাহরণ হ'ল লগিং, প্রমাণীকরণ এবং অন্যান্য সাধারণ, অনুভূমিক প্রক্রিয়াকরণ উপাদান । এগুলি প্রত্যেকের একাধিক অ্যাপ্লিকেশন জুড়ে যে জিনিসগুলির প্রয়োজন তা হতে থাকে তবে খুব বেশি লোক নিজের তৈরি করতে আগ্রহী (বা হওয়া উচিত) নয়।

অধিক তথ্য


একটি বিষয় যা সম্পর্কে আমি অস্পষ্ট: সমস্ত মিডলওয়্যারগুলি কি একই ডেটা ভাগ করে? সুরক্ষার জন্য কি তাদের (অর্থাত স্যান্ডবক্স এক) আলাদা করা সম্ভব?
ব্রায়ান আর্মস্ট্রং

2
র্যাকটি আপনার আবেদনের অংশ তাই সমস্ত মিডলওয়্যার অনুরোধের একই অনুলিপিটি তৈরি করে এবং প্রত্যেকে এটিকে যে কোনও পদ্ধতিতে এটি পরিবর্তন করতে পারে। আফাইক, তাদের একইভাবে স্যান্ডবক্সের কোনও উপায় নেই যেখানে একই প্রক্রিয়াটির মধ্যে অন্য একটি বস্তুর স্যান্ডবক্সের কোনও উপায় নেই (রুবি স্যান্ডবক্সিংয়ের চেষ্টা থাকা সত্ত্বেও)।
ক্রিস ম্যাককলি

1
এবং বুঝতে পারছেন র্যাক রেকের থেকে আলাদা।
মনীশ শ্রীবাস্তব

1
আমি মিডলওয়্যারটিকে এমন কিছু হিসাবে ভাবতে চাই যা আমার অ্যাপ্লিকেশনের মাঝখানে বসে থাকে যা আমি কোড করেছিলাম এবং আমার সার্ভারে এবং কী থেকে যাচ্ছি ... যা র‌্যাকস্পেসে হোস্ট করা আছে। 'র্যাক মিডলওয়্যার' শব্দটি যে কারণে বিভ্রান্তিকর, আমরা সকলেই জানি, কারণ এটি কনফুসিয়াসই ছিল যা মূল র্যাক মিডলওয়্যার লিখেছিল, প্রায় 2000 বছর আগে। ফ্রান্সে.
এলপিলিচ

74

প্রথমত, র্যাক হ'ল দুটি জিনিস:

  • একটি ওয়েবসার্ভার ইন্টারফেস কনভেনশন
  • একটি রত্ন

র্যাক - ওয়েব সার্ভার ইন্টারফেস

র্যাকের মূল বিষয়গুলি একটি সাধারণ সম্মেলন। প্রতিটি র্যাকের সাথে সঙ্গতিপূর্ণ ওয়েবসারভার আপনি যে কোনও বস্তু তাকে দিয়েছেন তার কাছে সবসময় একটি কল পদ্ধতি কল করবে এবং সেই পদ্ধতির ফলাফল পরিবেশন করবে। এই কল পদ্ধতিটি দেখতে কীভাবে দেখতে হবে এবং কী ফিরে আসতে হবে তা র্যাক নির্দিষ্ট করে। এটা রাক।

আসুন এটি একটি সহজ চেষ্টা দিন। আমি WEBrick কে র্যাক কমপ্লায়েন্ট ওয়েবসার্ভার হিসাবে ব্যবহার করব, তবে তাদের মধ্যে যে কেউ তা করবে। আসুন একটি সাধারণ ওয়েব অ্যাপ্লিকেশন তৈরি করি যা একটি JSON স্ট্রিং প্রদান করে। এর জন্য আমরা কনফিগার.আরউ নামে একটি ফাইল তৈরি করব। কনফিগার.আরকে স্বয়ংক্রিয়ভাবে রাক রত্নের কমান্ড রাকআপ দ্বারা ডাকা হবে যা রেক-কমপ্লায়েন্ট ওয়েবসার্ভারে কনফিগাররিউয়ের বিষয়বস্তুগুলি কেবল চালাবে। সুতরাং কনফিগার.আর ফাইলটিতে নিম্নলিখিতটি যুক্ত করা যাক:

class JSONServer
  def call(env)
    [200, {"Content-Type" => "application/json"}, ['{ "message" : "Hello!" }']]
  end
end

map '/hello.json' do
  run JSONServer.new
end

কনভেনশনটি সুনির্দিষ্টভাবে বলে যে আমাদের সার্ভারে কল নামক একটি পদ্ধতি রয়েছে যা একটি পরিবেশের হ্যাশ গ্রহণ করে এবং ওয়েবসার্ভার পরিবেশন করার জন্য [স্ট্যাটাস, শিরোনাম, বডি] ফর্মের সাথে একটি অ্যারের ফিরিয়ে দেয়। আসুন কেবল র্যাকআপ কল করে এটি ব্যবহার করে দেখুন। একটি ডিফল্ট র্যাক কমপ্লায়েন্ট সার্ভার, সম্ভবত WEBrick বা মংগ্রেল শুরু হবে এবং তত্ক্ষণাত পরিষেবা দেওয়ার অনুরোধের জন্য অপেক্ষা করবে।

$ rackup
[2012-02-19 22:39:26] INFO  WEBrick 1.3.1
[2012-02-19 22:39:26] INFO  ruby 1.9.3 (2012-01-17) [x86_64-darwin11.2.0]
[2012-02-19 22:39:26] INFO  WEBrick::HTTPServer#start: pid=16121 port=9292

ইউআরএল http://localhost:9292/hello.jsonএবং ভয়েলা কার্লিং করে বা পরিদর্শন করে আমাদের নতুন জেএসএন সার্ভারটি পরীক্ষা করি :

$ curl http://localhost:9292/hello.json
{ message: "Hello!" }

এটা কাজ করে। গ্রেট! এটি প্রতিটি ওয়েব ফ্রেমওয়ার্কের ভিত্তি, এটি রেল বা সিনেট্রা হোক। কিছু সময়ে তারা একটি কল পদ্ধতি প্রয়োগ করে, সমস্ত ফ্রেমওয়ার্ক কোডের মাধ্যমে কাজ করে এবং অবশেষে টিপিক্যাল [স্ট্যাটাস, শিরোনাম, বডি] আকারে প্রতিক্রিয়া ফিরিয়ে দেয়।

উদাহরণস্বরূপ রেল অন রুবেলে রাকের অনুরোধগুলি ক্লাসটিকে হিট করে ActionDispatch::Routing.Mapperযা এইরকম দেখাচ্ছে:

module ActionDispatch
  module Routing
    class Mapper
      ...
      def initialize(app, constraints, request)
        @app, @constraints, @request = app, constraints, request
      end

      def matches?(env)
        req = @request.new(env)
        ...
        return true
      end

      def call(env)
        matches?(env) ? @app.call(env) : [ 404, {'X-Cascade' => 'pass'}, [] ]
      end
      ...
  end
end

সুতরাং মূলত রেল চেকগুলি, কোনও রুটের সাথে মেলে যদি এনভি হ্যাশের উপর নির্ভর করে। যদি তাই হয় তবে এই প্রতিবেদনের গণনা করার জন্য এএনভি হ্যাশটি অ্যাপ্লিকেশনটিতে চলে যায়, অন্যথায় এটি অবিলম্বে একটি 404 এর সাথে সাড়া দেয় So সুতরাং কোনও ওয়েবসার্ভার যা র‌্যাক ইন্টারফেস কনভেনশনটির সাথে সম্মতিযুক্ত, একটি সম্পূর্ণরূপে বিকশিত রেল অ্যাপ্লিকেশন পরিবেশন করতে সক্ষম।

মিডলওয়্যার

র্যাক মিডলওয়্যার স্তরগুলি তৈরি করতেও সমর্থন করে। তারা মূলত একটি অনুরোধকে বাধা দেয়, এটির সাথে কিছু করুন এবং এটি পাস করুন। বহুমুখী কাজের জন্য এটি খুব দরকারী।

ধরা যাক আমরা আমাদের JSON সার্ভারে লগিং যুক্ত করতে চাই যা একটি অনুরোধটি কত সময় নেয় তাও পরিমাপ করে। আমরা কেবল একটি মিডলওয়্যার লগার তৈরি করতে পারি যা ঠিক এটি করে:

class RackLogger
  def initialize(app)
    @app = app
  end

  def call(env)
    @start = Time.now
    @status, @headers, @body = @app.call(env)
    @duration = ((Time.now - @start).to_f * 1000).round(2)

    puts "#{env['REQUEST_METHOD']} #{env['REQUEST_PATH']} - Took: #{@duration} ms"
    [@status, @headers, @body]
  end
end

এটি তৈরি হয়ে গেলে, এটি আসল রাক অ্যাপ্লিকেশনটির একটি অনুলিপি নিজেকে সংরক্ষণ করে। আমাদের ক্ষেত্রে এটি আমাদের JSONSverver এর উদাহরণ। মিডলওয়্যারটিতে কলটি স্বয়ংক্রিয়ভাবে কল পদ্ধতিতে কল করে এবং [status, headers, body]আমাদের জেএসএন সার্ভারের মতো ফিরে আসার প্রত্যাশা করে ।

সুতরাং এই মিডওয়্যারটিতে স্টার্ট পয়েন্টটি নেওয়া হয়, তারপরে JSONServer এ আসল কলটি করা হয় @app.call(env), তারপরে লগার লগিং এন্ট্রি আউটপুট করে এবং অবশেষে প্রতিক্রিয়া হিসাবে ফিরে আসে [@status, @headers, @body]

আমাদের ছোট্ট rackup.ru এই মিডলওয়্যারটি ব্যবহার করতে, এটির জন্য এটির মতো একটি র্যাকলগার যুক্ত করুন:

class JSONServer
  def call(env)
    [200, {"Content-Type" => "application/json"}, ['{ "message" : "Hello!" }']]
  end
end

class RackLogger
  def initialize(app)
    @app = app
  end

  def call(env)
    @start = Time.now
    @status, @headers, @body = @app.call(env)
    @duration = ((Time.now - @start).to_f * 1000).round(2)

    puts "#{env['REQUEST_METHOD']} #{env['REQUEST_PATH']} - Took: #{@duration} ms"
    [@status, @headers, @body]
  end
end

use RackLogger

map '/hello.json' do
  run JSONServer.new
end   

সার্ভারটি পুনরায় চালু করুন এবং ভয়েলা, এটি প্রতিটি অনুরোধে একটি লগ আউটপুট দেয়। র্যাক আপনাকে একাধিক মিডলওয়্যার যুক্ত করতে দেয় যা তাদের যুক্ত করা ক্রমে ডাকা হয়। র্যাক অ্যাপ্লিকেশনটির মূলটি পরিবর্তন না করেই কার্যকারিতা যুক্ত করার এটি দুর্দান্ত এক উপায়।

রাক - রত্ন

যদিও র্যাক - প্রথমত - এটি একটি কনভেনশন এটিও একটি রত্ন যা দুর্দান্ত কার্যকারিতা সরবরাহ করে। এর মধ্যে একটি আমরা ইতিমধ্যে আমাদের JSON সার্ভার, র্যাকআপ কমান্ডের জন্য ব্যবহার করেছি। তবে আরও আছে! রাক মণি স্ট্যাটিক ফাইল বা এমনকি পুরো ডিরেক্টরি সরবরাহ করার মতো প্রচুর ব্যবহারের ক্ষেত্রে খুব কম অ্যাপ্লিকেশন সরবরাহ করে। আসুন আমরা কীভাবে একটি সহজ ফাইল পরিবেশন করি তা উদাহরণস্বরূপ htmls / index.html এ অবস্থিত একটি খুব প্রাথমিক HTML ফাইল:

<!DOCTYPE HTML>
  <html>
  <head>
    <title>The Index</title>
  </head>

  <body>
    <p>Index Page</p>
  </body>
</html>

আমরা সম্ভবত ওয়েবসাইটের মূল থেকে এই ফাইলটি পরিবেশন করতে চাই, সুতরাং আসুন আমাদের কনফিগারেশনগুলিতে নিম্নলিখিতগুলি যুক্ত করুন:

map '/' do
  run Rack::File.new "htmls/index.html"
end

আমরা যদি ঘুরে http://localhost:9292দেখি তবে আমাদের এইচটিএমএল ফাইলটি নিখুঁতভাবে রেন্ডার হয়েছে। এটা সহজ ছিল, তাই না?

আসুন / জাভাস্ক্রিপ্টের অধীনে কিছু জাভাস্ক্রিপ্ট ফাইল তৈরি করে এবং কনফিগারেশনে নিম্নলিখিতটি যুক্ত করে জাভাস্ক্রিপ্ট ফাইলগুলির একটি সম্পূর্ণ ডিরেক্টরি যুক্ত করব:

map '/javascripts' do
  run Rack::Directory.new "javascripts"
end

সার্ভারটি পুনরায় আরম্ভ করুন এবং দেখুন http://localhost:9292/javascriptএবং আপনি যে কোনও জাভাস্ক্রিপ্ট ফাইলগুলির তালিকা দেখতে পাবেন যে কোনও জায়গা থেকে এখনই আপনি অন্তর্ভুক্ত করতে পারেন।


3
তবে র্যাক মিডলওয়্যার নয়?
রুপ

1
আপনি যদি জানেন না যে র্যাকটি কী, আপনি এই ব্লগ পোস্টটি পড়ার পরে ঠিক কী তা এবং এটি কীভাবে ব্যবহার করবেন তা আপনি ঠিক বুঝতে পারবেন । খুব সুন্দর. হাস্যকরভাবে, পোস্টের শেষে অফিসিয়াল র্যাক ডকুমেন্টেশনের লিঙ্কটি আর পাওয়া যায় না!
কলিন

আপনার অধিকার, ধন্যবাদ আমি পোস্টগুলিতে সামগ্রীগুলি অন্তর্ভুক্ত করেছি এবং মৃত লিঙ্কটি সরিয়েছি।
টমাস ফানখাউজার

আমি বলব যে এটি কোনও সম্মেলন নয়। এটি একটি ইন্টারফেস, একটি অনুরোধ-প্রতিক্রিয়া মডেলের জন্য
রন ক্লেইন

20

আমার খুব ভাল সময়ের জন্য র্যাকটি বুঝতে সমস্যা হয়েছিল। আমি নিজেই এই ক্ষুদ্র রুবি ওয়েব সার্ভারটি তৈরির কাজ করার পরে এটি পুরোপুরি বুঝতে পেরেছি । আমি আমার ব্লগে রাক (গল্পের আকারে) সম্পর্কে আমার শিক্ষাগুলি এখানে ভাগ করেছি: http://gauravchande.com/ কি-is-rack- in- ruby-rails

মতামত স্বাগত চেয়ে বেশি।


13
কেবলমাত্র লিঙ্কের উত্তরগুলি স্ট্যাক ওভারফ্লোতে নিরুৎসাহিত করা হয় , কারণ যদি সংস্থানটি ভবিষ্যতে লিঙ্কটিতে যায় না তবে উত্তরটি অকেজো হয়ে যায়। কমপক্ষে আপনার ব্লগ পোস্টের সম্পর্কিত পয়েন্টগুলি সংক্ষিপ্ত করে এটিকে এই উত্তরে যুক্ত করুন।

পোস্ট করার জন্য আপনাকে ধন্যবাদ। আমি খুব শিক্ষানবিস রেলস প্রোগ্রামার এবং আমি আপনার পরিষ্কার পোস্টের সাথে র্যাক ধারণাটি বুঝতে পেরেছিলাম।
এডুয়ার্ডো রামোস

দুর্দান্ত ব্লগ পোস্ট। অন্যান্য উত্তরগুলি আরও কিছুটা বিশৃঙ্খলাযুক্ত IMO বলে মনে হচ্ছে।
ক্ল্যাম

কি অসাধারণ ব্যাখ্যা। ধন্যবাদ, গৌরব
রোভিতুলি

7

config.ru ন্যূনতম চলমান উদাহরণ

app = Proc.new do |env|
  [
    200,
    {
      'Content-Type' => 'text/plain'
    },
    ["main\n"]
  ]
end

class Middleware
  def initialize(app)
    @app = app
  end

  def call(env)
    @status, @headers, @body = @app.call(env)
    [@status, @headers, @body << "Middleware\n"]
  end
end

use(Middleware)

run(app)

দৌড়ে rackupগিয়ে দর্শন করুন localhost:9292। আউটপুটটি হ'ল:

main
Middleware

সুতরাং এটি পরিষ্কার যে Middlewareমুখ্য অ্যাপ্লিকেশনটিকে মোড়ক করে এবং কল করে। সুতরাং এটি অনুরোধটি প্রাক-প্রক্রিয়া করতে এবং কোনওভাবেই প্রতিক্রিয়া পোস্ট-প্রক্রিয়া করতে সক্ষম।

যেমনটি এখানে ব্যাখ্যা করা হয়েছে: http://guides.rubyonrails.org/rails_on_rack.html#action-dispatcher-moodware-stack , রেলগুলি র্যাক মিডলওয়্যারগুলি এর কার্যকারিতার জন্য অনেকগুলি ব্যবহার করে এবং আপনি config.middleware.useপারিবারিক পদ্ধতিতে নিজেরও যুক্ত করতে পারেন ।

মিডলওয়্যারটিতে কার্যকারিতা বাস্তবায়নের সুবিধা হ'ল আপনি এটি কোনও র্যাক ফ্রেমওয়ার্কে পুনরায় ব্যবহার করতে পারেন, এইভাবে সমস্ত বড় রুবি, কেবলমাত্র রেলগুলি নয়।


6

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


4

আমি কয়েকটি সমস্যার সমাধান করতে র্যাক মিডলওয়্যার ব্যবহার করেছি:

  1. কাস্টম র্যাক মিডলওয়্যারের সাথে জেএসএন পার্স ত্রুটি ধরা এবং যখন ক্লায়েন্ট জেএসওএনকে ফাঁকা করে জমা দেয় তখন দুর্দান্ত ফর্ম্যাট করা ত্রুটি বার্তা ফিরে আসে
  2. রাক :: ডিফল্টর মাধ্যমে সামগ্রী সংক্ষেপণ

উভয় ক্ষেত্রে এটি বেশ মার্জিত সংশোধন করেছে।


2
এই উত্তরটি কিছুটা কার্যকর থাকা সত্ত্বেও র্যাক মিডলওয়্যার কী তা এই প্রশ্নটির মূলত ঠিকানা দেয় না ।

এছাড়াও
এটির

4

র্যাক কি?

র্যাব রুবি এবং রুবি ফ্রেমওয়ার্কগুলিকে সমর্থনকারী ওয়েব সার্ভারের মধ্যে একটি ন্যূনতম ইন্টারফেস সরবরাহ করে।

র্যাক ব্যবহার করে আপনি একটি র্যাক অ্যাপ্লিকেশন লিখতে পারেন।

র্যাক আপনার র্যাক অ্যাপ্লিকেশনটিতে এনভায়রনমেন্ট হ্যাশ (একটি হ্যাশ, একটি ক্লায়েন্টের কাছ থেকে এইচটিটিপি অনুরোধের অন্তর্ভুক্ত, সিজিআই-এর মতো শিরোলেখের) প্রেরণ করবে যা এই হ্যাশের থাকা জিনিসগুলি যা খুশি তাই ব্যবহার করতে পারে।

একটি র্যাক অ্যাপ্লিকেশন কী?

র্যাকটি ব্যবহার করতে, আপনাকে অবশ্যই একটি 'অ্যাপ' সরবরাহ করতে হবে - এমন একটি বস্তু যা #callপরিবেশের হ্যাশটির সাথে প্যারামিটার হিসাবে পদ্ধতিটির প্রতিক্রিয়া জানায় (সাধারণত হিসাবে সংজ্ঞায়িত হয় env)। #callঅবশ্যই তিনটি মানের একটি অ্যারে প্রদান করতে হবে:

  • স্থিতি কোড (যথা, '200'),
  • একটি হেডার হ্যাশ ,
  • রেসপন্স দেহ (যা, রুবি পদ্ধতি সাড়া আবশ্যক each)।

আপনি একটি র্যাক অ্যাপ্লিকেশন লিখতে পারেন যা এই জাতীয় অ্যারে দেয় - এটি আপনার ক্লায়েন্টকে র্যাকের মাধ্যমে একটি প্রতিক্রিয়াতে ফেরত পাঠানো হবে (এটি আসলে শ্রেণীর উদাহরণ হতে পারে Rack::Response[ডক্সে যাওয়ার জন্য ক্লিক করুন])।

একটি খুব সাধারণ র্যাক অ্যাপ্লিকেশন:

  • gem install rack
  • একটি config.ruফাইল তৈরি করুন - র্যাক এটি সন্ধান করতে জানে।

আমরা একটি ক্ষুদ্র তাক আবেদন করে একটি প্রতিক্রিয়া (একটি দৃষ্টান্ত ফেরৎ তৈরি করবে Rack::Response) যিনি প্রতিক্রিয়া দেহ একটি অ্যারের একটি স্ট্রিং রয়েছে: "Hello, World!"

কমান্ডটি ব্যবহার করে আমরা একটি স্থানীয় সার্ভার ফায়ার করব rackup

আমাদের ব্রাউজারে প্রাসঙ্গিক বন্দর দেখার সময় আমরা "হ্যালো, ওয়ার্ল্ড!" দেখতে পাব ভিউপোর্টে রেন্ডার করা।

#./message_app.rb
class MessageApp
  def call(env)
    [200, {}, ['Hello, World!']]
  end
end

#./config.ru
require_relative './message_app'

run MessageApp.new

স্থানীয় সার্ভার দিয়ে আগুন জ্বালান rackupএবং লোকালহোস্ট দেখুন: 9292 এবং আপনার 'হ্যালো, ওয়ার্ল্ড!' দেখতে পাওয়া উচিত অনুষ্ঠিত.

এটি কোনও বিস্তৃত ব্যাখ্যা নয়, তবে মূলত এখানে যা ঘটে তা হ'ল ক্লায়েন্ট (ব্রাউজার) আপনার স্থানীয় সার্ভারের মাধ্যমে র্যাকের জন্য একটি HTTP অনুরোধ প্রেরণ করে এবং র্যাকটি ইনস্ট্যান্টিয়েট করে MessageAppএবং চালায় call, পদ্ধতিটিতে প্যারামিটার হিসাবে পরিবেশগত হ্যাশ পেরিয়ে যায় ( envযুক্তি)।

র্যাকটি রিটার্ন মান (অ্যারে) নেয় এবং এটির উদাহরণ তৈরি করতে এটি ব্যবহার করে Rack::Responseএবং ক্লায়েন্টকে এটি প্রেরণ করে। ব্রাউজারটি 'হ্যালো, ওয়ার্ল্ড!' মুদ্রণের জন্য যাদু ব্যবহার করে ! পর্দায়।

ঘটনাচক্রে, যদি আপনি পরিবেশের হ্যাশ দেখতে কেমন দেখতে চান তবে কেবল puts envনীচে রাখুন def call(env)

এটি যেমন ন্যূনতম, আপনি এখানে যা লিখেছেন তা একটি র্যাক অ্যাপ্লিকেশন!

একটি র্যাক অ্যাপ্লিকেশন তৈরি করে ইনকামিং এনভায়রনমেন্ট হ্যাশের সাথে ইন্টারঅ্যাক্ট করা হচ্ছে

আমাদের ছোট্ট র্যাক অ্যাপ্লিকেশনটিতে আমরা হ্যাশটির সাথে যোগাযোগ করতে পারি env( এনভায়রনমেন্ট হ্যাশ সম্পর্কে আরও জানতে এখানে দেখুন)।

আমরা ব্যবহারকারীর জন্য নিজস্ব ক্যোয়ারী স্ট্রিংটি ইউআরএল-তে ইনপুট করার দক্ষতাটি প্রয়োগ করব, সুতরাং, সেই স্ট্রিংটি এইচটিটিপি অনুরোধে উপস্থিত থাকবে, পরিবেশের হ্যাশের কী / মান জোড়গুলির মধ্যে একটিতে মান হিসাবে আবদ্ধ হয়।

আমাদের র্যাক অ্যাপ্লিকেশনটি পরিবেশের হ্যাশ থেকে সেই ক্যোয়ারী স্ট্রিংটি অ্যাক্সেস করবে এবং প্রতিক্রিয়ার বডি এর মাধ্যমে ক্লায়েন্টকে (আমাদের ব্রাউজার, এই ক্ষেত্রে) ফেরত পাঠাবে case

এনভায়রনমেন্ট হ্যাশ র্যাক ডকস থেকে: "QUERY_STRING: অনুরোধ ইউআরএল এর যে অংশটি অনুসরণ করে?, যদি থাকে? খালি থাকতে পারে, তবে সর্বদা প্রয়োজন!"

#./message_app.rb
class MessageApp
  def call(env)
    message = env['QUERY_STRING']
    [200, {}, [message]]
  end
end

এখন, rackupএবং দেখুন localhost:9292?hello( ?helloক্যোয়ারী স্ট্রিং হচ্ছে) এবং আপনার ভিউপোর্টে 'হ্যালো' রেন্ডার করা উচিত।

র্যাক মিডলওয়্যার

আমরা করব:

  • আমাদের কোডবেস মধ্যে তাক মিডলওয়্যার এক টুকরা সন্নিবেশ - একটি শ্রেণী: MessageSetter,
  • পরিবেশ হ্যাশ এই শ্রেণীর প্রথম আঘাত করবে এবং একটি প্যারামিটার হিসাবে গৃহীত হবে: env,
  • MessageSetterএকটি ঢোকাব 'MESSAGE'env হ্যাশ মধ্যে কী, এর মান হচ্ছে 'Hello, World!'যদি env['QUERY_STRING']খালি; env['QUERY_STRING']যদি না,
  • পরিশেষে, এটি ফিরে আসবে @app.call(env)- @app'স্ট্যাক' থেকে পরবর্তী অ্যাপ্লিকেশন হচ্ছে: MessageApp

প্রথমত, 'দীর্ঘ-হাত' সংস্করণ:

#./middleware/message_setter.rb
class MessageSetter
  def initialize(app)
    @app = app
  end

  def call(env)
    if env['QUERY_STRING'].empty?
      env['MESSAGE'] = 'Hello, World!'
    else
      env['MESSAGE'] = env['QUERY_STRING']
    end
    @app.call(env)
  end
end

#./message_app.rb (same as before)
class MessageApp
  def call(env)
    message = env['QUERY_STRING']
    [200, {}, [message]]
  end
end

#config.ru
require_relative './message_app'
require_relative './middleware/message_setter'

app = Rack::Builder.new do
  use MessageSetter
  run MessageApp.new
end

run app

থেকে তাক :: নির্মাতা ডক্স আমরা দেখতে Rack::Builderকার্যকরী iteratively এই কনস্ট্রাক্ট তাক অ্যাপ্লিকেশন একটি ছোট ডিএসএল। এর মূল অর্থ হল আপনি এক বা একাধিক মিডলওয়্যারের সমন্বয়ে একটি 'স্ট্যাক' এবং প্রেরণের জন্য 'নীচের স্তরের' অ্যাপ্লিকেশনটি তৈরি করতে পারেন। আপনার নীচের স্তরের অ্যাপ্লিকেশনটিতে যাবার সমস্ত অনুরোধগুলি প্রথমে আপনার মিডলওয়্যার দ্বারা প্রক্রিয়া করা হবে।

#useস্ট্যাকে মিডলওয়্যার ব্যবহার করতে নির্দিষ্ট করে। এটি মিডলওয়্যারটিকে আর্গুমেন্ট হিসাবে গ্রহণ করে।

র্যাক মিডলওয়্যার অবশ্যই:

  • একটি কনস্ট্রাক্টর রয়েছে যা প্যারামিটার হিসাবে স্ট্যাকের পরবর্তী অ্যাপ্লিকেশন গ্রহণ করে।
  • callপরিবেশের হ্যাশটিকে প্যারামিটার হিসাবে গ্রহণ করে এমন পদ্ধতিতে প্রতিক্রিয়া জানান ।

আমাদের ক্ষেত্রে, ' MessageSetterমিডলওয়্যার ' হ'ল , 'কনস্ট্রাক্টর' হ'ল মেসেজশিটারের initializeপদ্ধতি, স্ট্যাকের 'পরবর্তী অ্যাপ্লিকেশন' MessageApp

সুতরাং এখানে, Rack::Builderহুডের নীচে কী করে, এর পদ্ধতির appযুক্তিটি হ'ল ।MessageSetterinitializeMessageApp

(এগিয়ে যাওয়ার আগে উপরের দিকে আপনার মাথা পেতে)

সুতরাং, মিডলওয়্যারের প্রতিটি টুকরাই মূলত বিদ্যমান পরিবেশ হ্যাশটিকে চেইনের পরবর্তী অ্যাপ্লিকেশনটিতে 'পাস' করে দেয় - সুতরাং স্ট্যাকের পরবর্তী অ্যাপ্লিকেশনটিতে যাওয়ার আগে মিডলওয়্যারের মধ্যে সেই পরিবেশের হ্যাশটিকে রূপান্তর করার সুযোগ আপনার রয়েছে।

#runএকটি আর্গুমেন্ট গ্রহণ করে যা এমন একটি বস্তু যা প্রতিক্রিয়া জানায় #callএবং একটি র্যাক প্রতিক্রিয়া দেয় (একটি উদাহরণ Rack::Response)।

উপসংহার

ব্যবহার Rack::Builderআপনি (, আমাদের ক্ষেত্রে Middlewares শৃঙ্খল এবং আপনার অ্যাপ্লিকেশান কোনো অনুরোধ প্রতিটি মিডলওয়্যার দ্বারা পরিশেষে স্ট্যাক চূড়ান্ত টুকরা দ্বারা প্রক্রিয়াকৃত হওয়ার আগে ঘুরে প্রক্রিয়া করা হবে গঠন করা যেতে পারে MessageApp)। এটি অত্যন্ত কার্যকর কারণ এটি প্রক্রিয়াকরণের অনুরোধগুলির বিভিন্ন পর্যায়ে আলাদা করে দেয়। 'উদ্বেগের বিচ্ছেদ' এর বিচারে এটি আরও পরিষ্কার হতে পারে না!

আপনি বেশ কয়েকটি মিডলওয়্যারের সমন্বয়ে একটি 'অনুরোধ পাইপলাইন' তৈরি করতে পারেন যা এই জাতীয় জিনিসগুলিতে ডিল করে:

  • প্রমাণীকরণ
  • অনুমোদন
  • ক্যাশিং
  • প্রসাধন
  • পারফরম্যান্স এবং ব্যবহার নিরীক্ষণ
  • সম্পাদন (আসলে অনুরোধটি পরিচালনা করুন এবং একটি প্রতিক্রিয়া সরবরাহ করুন)

(উপরের বুলেট পয়েন্টগুলি এই থ্রেডের অন্য উত্তর থেকে)

আপনি প্রায়শই পেশাদার সিনেট্রা অ্যাপ্লিকেশনগুলিতে এটি দেখতে পাবেন। সিনাত্রা র‌্যাক ব্যবহার করে! দেখুন এখানে কি Sinatra, সংজ্ঞা জন্য IS !

চূড়ান্ত নোট হিসাবে, আমাদের config.ruশর্ট-হ্যান্ড স্টাইলে লিখিত হতে পারে ঠিক একই কার্যকারিতা তৈরি করে (এবং এটিই আপনি সাধারণত দেখতে পাবেন):

require_relative './message_app'
require_relative './middleware/message_setter'

use MessageSetter
run MessageApp.new

এবং কী MessageAppকরছে তা আরও স্পষ্টভাবে দেখানোর জন্য, এটির 'লম্বা হাত' সংস্করণটি স্পষ্টভাবে দেখায় যে প্রয়োজনীয় তিনটি যুক্তি সহ #callএকটি নতুন উদাহরণ তৈরি করছে Rack::Response

class MessageApp
  def call(env)
    Rack::Response.new([env['MESSAGE']], 200, {})
  end
end

উপকারী সংজুক


1

রাক - ইন্টারফেস বি / ডাব্লু ওয়েব এবং অ্যাপ্লিকেশন সার্ভার

র্যাক একটি রুবি প্যাকেজ যা ওয়েব সার্ভারের সাথে অ্যাপ্লিকেশনটির সাথে যোগাযোগের জন্য একটি ইন্টারফেস সরবরাহ করে। আপনার অনুরোধ / প্রতিক্রিয়াটি যেভাবে আচরণ করে তা সংশোধন করতে ওয়েব সার্ভার এবং অ্যাপের মধ্যে মিডলওয়্যার উপাদান যুক্ত করা সহজ। মিডওয়্যার উপাদানটি ক্লায়েন্ট এবং সার্ভারের মধ্যে বসে ইনবাউন্ড অনুরোধগুলি এবং আউটবাউন্ড প্রতিক্রিয়াগুলি প্রসেস করে।

সাধারণ কথায়, এটি সার্ভার এবং একটি রেল অ্যাপ (বা অন্য কোনও রুবি ওয়েব অ্যাপ্লিকেশন) একে অপরের সাথে কীভাবে কথা বলতে হবে সে সম্পর্কে মূলত গাইডলাইনগুলির একটি সেট

র্যাকটি ব্যবহার করতে, একটি "অ্যাপ্লিকেশন" সরবরাহ করুন: এমন একটি বস্তু যা কল পদ্ধতির প্রতিক্রিয়া জানায়, পরিবেশ হ্যাশটিকে প্যারামিটার হিসাবে গ্রহণ করে এবং তিনটি উপাদান সহ একটি অ্যারে ফিরিয়ে দেয়:

  • এইচটিটিপি প্রতিক্রিয়া কোড
  • শিরোনামের একটি হ্যাশ
  • প্রতিক্রিয়া শরীর , যা প্রতিটি সাড়া আবশ্যক অনুরোধ

আরও ব্যাখ্যার জন্য, আপনি নীচের লিঙ্কগুলি অনুসরণ করতে পারেন।

1. https://rack.github.io/
2. https://redpanthers.co/rack-middleware/
3. https://blog.engineyard.com/2015/understanding-rack-apps-and-middleware
4. https://guides.rubyonrails.org/rails_on_rack.html#resources

রেলগুলিতে, আমাদের একটি রেক ফাইল হিসাবে কনফিগার.আর রয়েছে, আপনি rackupকমান্ড দিয়ে যে কোনও রেক ফাইল চালাতে পারেন । এবং এটির জন্য ডিফল্ট পোর্ট 9292। এটি পরীক্ষা করতে, আপনি কেবল rackupআপনার রেল ডিরেক্টরিতে চালাতে পারেন এবং ফলাফলটি দেখতে পারেন। আপনি যে পোর্টটি চালাতে চান তাও নির্ধারণ করতে পারেন। যে কোনও নির্দিষ্ট পোর্টে র্যাক ফাইল চালানোর কমান্ড

rackup -p PORT_NUMBER

1

ইউনিকর্ন এবং রেলের মধ্যে চিত্র প্রদর্শন করছে

রাক হ'ল একটি মণি যা এইচটিটিপি অনুরোধ / প্রতিক্রিয়া বিমূর্ত করার জন্য একটি সাধারণ ইন্টারফেস সরবরাহ করে। অ্যাডাপ্টার হিসাবে রাক ওয়েব ফ্রেমওয়ার্ক (রেলস, সিনেট্রা ইত্যাদি) এবং ওয়েব সার্ভারের (ইউনিকর্ন, পুমা) মধ্যে বসে। উপরের চিত্রটি থেকে এটি ইউনিকর্ন সার্ভারটিকে রেল এবং রেল সম্পর্কে জানা থেকে সম্পূর্ণ স্বাধীন রাখে এবং ইউনিকর্ন সম্পর্কে জানে না। এটি আলগা দম্পতি , উদ্বেগ পৃথককরণের একটি ভাল উদাহরণ ।

উপরের চিত্রটি রেল https://youtu.be/3PnUV9QzB0g এ রেল সম্মেলনের আলাপ থেকে আমি গভীর বোঝার জন্য এটি দেখার পরামর্শ দিই।

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