Программирование на языке Ruby
Программирование на языке Ruby читать книгу онлайн
Внимание! Книга может содержать контент только для совершеннолетних. Для несовершеннолетних чтение данного контента СТРОГО ЗАПРЕЩЕНО! Если в книге присутствует наличие пропаганды ЛГБТ и другого, запрещенного контента - просьба написать на почту [email protected] для удаления материала
Можно также представить себе, что вы хотите предоставить интерфейс к некоему сервису, не раскрывая исходных текстов. Часто это делается с помощью Web-приложений, но из-за отсутствия состояния в протоколе HTTP это не всегда удобно (есть и другие недостатки). Механизм распределенного программирования позволяет решать подобные задачи более естественно.
В мире Ruby ответом на этот вызов стала программа drb, написанная Масатоси Секи (Masatoshi Seki); еще ее название записывают так: DRb. Существуют и другие способы распределенной обработки на Ruby, но drb, пожалуй, самый легкий. Здесь нет сложных служб разрешения имен, как в CORBA. Это всего лишь простая и удобная библиотека, предоставляющая всю необходимую функциональность. В данной главе мы рассмотрим основы работы как с ней самой, так и с надстроенной над ней системой Rinda.
20.1. Обзор: библиотека drb
Библиотека
drbСервер:
• запускает TCPServer и начинает прослушивать порт;
• привязывает объект к экземпляру сервера
drb• принимает запросы на соединение от клиентов и отвечает на их сообщения;
• дополнительно может предоставлять контроль доступа (безопасность).
Клиент:
• устанавливает соединение с сервером;
• привязывает локальный объект к удаленному экземпляру сервера;
• посылает сообщения серверу и получает ответы.
Метод класса
start_servicenilrequire "drb"myobj = MyServer.newDRb.start_service("druby://:1234", myobj) # Порт 1234.# ...Если порт выбирается динамически, то для получения полного URI, включающего и номер порта, можно воспользоваться методом класса
uriDRb.start_service(nil, myobj)myURI = DRb.uri # "druby://hal9000:2001"Поскольку
drbjoin# Предотвратить преждевременный выход.DRb.thread.joinНа стороне клиента мы вызываем метод
start_serviceDRbObjectDRbObject.newnilrequire "drb"DRb.start_serviceobj = DRbObject.new(nil, "druby://hal9000:2001")# Сообщения, передаваемые obj, перенаправляются# удаленному объекту на стороне сервера...Следует подчеркнуть, что на стороне сервера привязка осуществляется к единственному объекту, который должен отвечать на все получаемые запросы. Если клиентов несколько, то объект должен быть безопасным относительно потоков, чтобы не оказаться в некорректном состоянии. (Для совсем простых или узкоспециализированных приложений это может быть и необязательно.)
Мы не можем вдаваться в технические детали. Но имейте в виду, что если клиент читает или изменяет внутреннее состояние удаленного объекта, то при наличии нескольких клиентов возможна интерференция. Во избежание таких неприятностей мы рекомендуем применять механизмы синхронизации, например класс
MutexСкажем хотя бы несколько слов о безопасности. Ведь не всегда желательно, чтобы с вашим сервером мог соединяться кто угодно. Помешать им пытаться вы не можете, зато можете сделать такие попытки безуспешными.
В программе
drbПриведем пример. Для создания нового списка ACL мы воспользуемся классом
ACLВторой (необязательный) параметр метода
ACL.newDENY_ALLOWALLOW_DENYПервый параметр
ACL.new"deny""allow"require "drb/acl"acl = ACL.new( %w[ deny all allow 192.168.0.* allow 210.251.121.214 allow localhost] )Первая пара в этом примере, строго говоря, излишня, но проясняет смысл всей конструкции.
А как используются ACL? Метод
install_aclstart_service# Продолжение примера...DRb.install_acl(acl)DRb.start_service(nil, some_object)# ...Теперь, после запуска сервиса любой неавторизованный запрос на соединение приведет к исключению
RuntimeErrorЭто, конечно, не все, что можно сказать о библиотеке
drb20.2. Пример: эмуляция биржевой ленты
В этом примере сервер публикует в сети биржевые котировки акций. К серверу может обратиться любой клиент, желающий узнать, сколько сейчас стоит его пакет.
