[Azure+Ruby] Использование MS Azure Queue из Ruby


Введение

Microsoft не зря активно продвигает и развивает Azure - добрался он и до нас. И несмотря на то, что наиболее комфортно в азуре себя чувствуют .NET приложения, иногда возникают задачи интеграции с такими приложениями из платформ, далеких от .NET.

Недавно у нас возникла задача такой интеграции из системы, написанной на Ruby. Интеграционный сценарий просто: необходимо передать в .NET приложение некоторое событие. А как это надежнее всего сделать с .NET приложением, близким к Azure? Правильно! Надо использовать MS Azure Queue.

Сегодня я покажу, как использовать MS Azure Queue из Ruby.


Задачи

  1. Создание очереди
  2. Публикация события
  3. Получения события
  4. Удаление очереди

Код

#!/usr/bin/env ruby

require 'time'
require 'base64'
require 'openssl'
require 'net/http'
require 'cgi'

def make_azure_call(account, sharedkey_base64, method_cls, path, content = nil)
        content_length = 0

        unless content.nil?
                content_length = content.length
        end

        uri = URI("http://" + account +".queue.core.windows.net" + path)

        if uri.query.nil?
                uri_params = {}
        else
                uri_params = CGI.parse(uri.query)
        end

        date  = Time.now.gmtime.strftime "%a, %d %b %Y %H:%M:%S GMT"

        string_to_sign = "#{method_cls::METHOD}\n\n\n#{content_length}"
        string_to_sign << "\n\n\n\n\n\n\n\n\n"
        string_to_sign << "x-ms-date:#{date}\n"
        string_to_sign << "x-ms-version:2009-09-19\n/#{account}#{uri.path}"

        # FIXME: not sure that order is correct. 
        # Keys MUST be ordered lexicographically
        uri_params.each do |key, val|
                string_to_sign << "\n"
                string_to_sign << key << ':' << val[0]
        end

# puts string_to_sign

        key    = Base64.strict_decode64(sharedkey_base64)
        digest = OpenSSL::Digest::Digest.new("sha256")
        hmac   = OpenSSL::HMAC.digest(digest, key, string_to_sign)
        hmac64 = Base64.strict_encode64(hmac)

        req = method_cls.new(path)
        req['Content-Length'] = content_length
        req['Date']           = date
        req['x-ms-date']      = date
        req['x-ms-version']   = '2009-09-19'
        req['Authorization']  = "SharedKey #{account}:#{hmac64}"

        unless content.nil?
                req.body = content
                req.content_type = ''
        end

        http = Net::HTTP.new(uri.host, uri.port)
# http.set_debug_output $stderr
        http.request req do |res|
                puts res.code
                puts res.message
                puts res.body
        end
end

acc   = "YOUR_AZURE_ACCOUNT"
key   = "YOUR_SHARED_KEY_IN_BASE64" # Надо найти в консоли Azure
queue = "YOUR_QUEUE_NAME"

# create queue
make_azure_call(acc, key, Net::HTTP::Put, "/#{queue}")

# Put message
msg = '<QueueMessage><MessageText>message-content</MessageText></QueueMessage>'

make_azure_call(acc, key, Net::HTTP::Post, "/#{queue}/messages?messagettl=300", msg)

# get messages
make_azure_call(acc, key, Net::HTTP::Get, "/#{queue}/messages")

# delete queue
make_azure_call(acc, key, Net::HTTP::Delete, "/#{queue}")

Ссылки

http://msdn.microsoft.com/en-us/library/windowsazure/dd179363
http://msdn.microsoft.com/en-us/library/windowsazure/dd179428
http://www.ruby-doc.org/stdlib-1.9.3/libdoc/net/http/rdoc/Net/HTTP.html
http://blog.wolfman.com/articles/2006/5/26/howto-format-ruby-code-for-blogs :)

No comments: