Предложения библиотеки С++ для RPC
Я ищу предложения относительно библиотек RPC, реализованных на С++, для разработчиков на С++.
Некоторые ограничения требований:
- Должно работать как с системами linux/unix, так и с win32.
- Уметь выполнять бесплатные функции и методы класса
- Надеюсь, написанный на современном С++ не 90-е/java-esque С++
- Уметь работать через сети и hetrogenous архитектуры.
- Не слишком медленный или неэффективный
- Мы надеемся предоставить интерфейсы для стиля TR1 std:: function и др.
Мой пример использования - вызывать свободную функцию foo на удаленной машине.
---snip---
// foo translation unit
int foo(int i, int j)
{
return i + j;
}
---snip---
---snip---
// client side main
int main()
{
//register foo on client and server
//setup necassary connections and states
int result;
if (RPCmechanism.invoke("foo",4,9,result))
std::cout << "foo(4,9) = " result << std::endl;
else
std::cout << "failed to invoke foo(4,9)!" << std::endl;
return 0;
}
---snip---
Что-то, что может достичь вышеупомянутого или подобного, было бы здорово.
Примечание. Я НЕ заинтересован в других языковых привязках. Пожалуйста, не предлагайте решение, потому что оно имеет другие языковые привязки. Меня интересуют только хорошо разработанные RPC-фреймворки, написанные на С++ для языка С++, которые эффективны и подходят для сценариев HPC.
Ответы
Ответ 1
Это довольно набор требований...
Пока они не встречаются со всеми (поскольку я не уверен, что такой зверь существует, я рекомендую вашему вниманию ICE от ZeroC. Разработанный частично Мичи Хеннинг из славы CORBA (и спросите своих друзей в телекоммуникационном секторе, это действительно не грязное слово), ICE - это то, что CORBA выглядело бы, если бы оно началось позже и не было разработано комитетом.
Их С++-отображение - это все, что CORBA нет, оно использует типы STL и, как правило, более новое ощущение.
Он терпит неудачу в тестах free-function и std:: function, но, учитывая невероятность поиска продукта для всего этого списка, это делает хорошую работу для многих остальных.
Удача
Ответ 2
Я также заинтересован в жизнеспособных реализациях С++ RPC. После некоторых исследований я обнаружил, что протоколы травления, бережливости и протоколов являются наиболее перспективными решениями, однако ни один из них не отвечает всем моим потребностям. Мои критерии поиска:
- многоязычный, с С++ и PHP как обязательный (С#, Java, Python, Perl не так важно сейчас)
- сервер может компилироваться/запускаться только в Linux (с Windows как долгосрочная цель)
- клиент должен работать в Windows и Linux (и, возможно, Mac)
- с открытым исходным кодом и коммерчески доступным (то есть без GPL)
- он должен поддерживать шифрование из коробки
И кандидаты:
В настоящее время я оцениваю возможность разработки уровня RPC для Protobuf с использованием APR.
Однако поиск продолжается...
EDIT: Мне удалось решить некоторые из этих проблем, используя Apache Qpid (версия С++) с protobuf для сериализации, хотя в настоящее время он не имеет некоторых функций, которые мне нужны.
Ответ 3
старые, такие как DCE-RPC, CORBA,
или Буферы протокола или Thrift, Etch,
или веб-сайты, такие как SOAP или REST.
Какой из них вы хотите, зависит от того, что вы хотите сделать. например. быстрый и эффективный RPC для локальной сети потребует легких бинарных RPC-подобных протокольных буферов, но RPC для гетерогенных веб-сервисов потребует гораздо более подробного SOAP.
Google использует PB для всех своих внутренних RPC, поэтому это хороший выбор. Facebook использует Thrift, поэтому его вряд ли маленький игрок, и MS любит SOAP.
Ответ 4
Вы пробовали бережливость, http://thrift.apache.org/?
Ответ 5
Проверьте FastRPC, http://fastrpc.sourceforge.net/.
Ответ 6
RCF выглядит так, как вы хотите: http://www.deltavsoft.com/index.html
Ответ 7
вы можете использовать protobuf реализовать один самостоятельно, и добавить все, что вы хотели featrue. Это не слишком сложно, и вы можете извлечь из этого много пользы.
Ответ 8
Следующий код, извлеченный из примера клиента TAO CORBA, показывает, что для подключения к серверу требуются 3 строки кода и одна строка кода для вызова функции. Обратите внимание, что вызов функции выглядит как вызов локальной локальной функции. Это может быть либо свободная функция, либо функция-член.
// Bring in the IOR
Object_var factory_object = orb->string_to_object (argv[1]);
// Now downcast the object reference
My_Factory_var factory = My_Factory::_narrow (factory_object.in ());
// Now get the full name and price of the other arguments:
Widget_var widget = factory->get_widget (argv[i]);
// Get its name, put it on a _var so it is automatically
// released!
String_var full_name = widget->full_name ();
// Now get the price
Double price = widget->price ();
cout << "The price of a widget in \""
<< full_name.in () << "\" is $"
<< price << endl;
Код сервера немного сложнее показать, но в CORBA, для чего вы хотите сделать, в основном, вы создаете интерфейс IDL, запускаете его через компилятор, а затем заполняете свою логику приложения в соответствующем слоте в заглушке. Итак, ваш основной код выглядит следующим образом:
// First initialize the ORB, that will remove some arguments...
ORB_var orb = ORB_init(argc, argv, "ORB" /* the ORB name, it can be anything! */);
Object_var poa_object = orb->resolve_initial_references("RootPOA");
PortableServer::POA_var poa = PortableServer::POA::_narrow(poa_object.in());
PortableServer::POAManager_var poa_manager = poa->the_POAManager();
poa_manager->activate();
// Create the servant
My_Factory_i my_factory_i;
// Activate it to obtain the object reference
My_Factory_var my_factory = my_factory_i._this();
// Put the object reference as an IOR string
String_var ior = orb->object_to_string (my_factory.in());
orb->run();
// Now in your stub file generated by the idl compiler,
char * Widget_i::full_name (
)
ACE_THROW_SPEC ((
::CORBA::SystemException
))
{
return "Some widget name";
}
::CORBA::Double Widget_i::price (
)
ACE_THROW_SPEC ((
::CORBA::SystemException
))
{
return 1.25;
}
Посмотрите Этот WikiBook для получения дополнительных ссылок и примеров