Хорошая альтернатива общедоступной памяти IPC для приложений на Java/С++ в Linux
В настоящее время я использую разделяемую память для IPC между приложениями Java и С++, но вы ищете более удобную альтернативу.
Может ли кто-нибудь посоветовать лучший метод с одинаковой производительностью и скоростью?
Спасибо!
Ответы
Ответ 1
Это зависит от того, как вы планируете взаимодействовать со своими приложениями. В среде POSIX у вас есть каналы, разделяемая память, сокеты, семафоры и очереди сообщений. См. Этот вопрос: Сравнивая IDIX linux IPC для получения дополнительной информации.
Какова модель взаимодействия для ваших процессов (например, клиент/сервер, производитель-потребитель и т.д.)?
Из личного опыта я бы предложил, чтобы ваш лучший выбор был бы трубами (поскольку они являются просто файлами для чтения и записи байтов) или сокетов (поскольку оба языка поддерживают их).
Ответ 2
Как сказал mikelong, это многое зависит от того, что вы делаете. AFAIK, ни один из методов IPC не имеет собственных привязок Java, поэтому вам, вероятно, придется использовать JNI и создавать привязки самостоятельно, поэтому все разные методы примерно одинаково сложны. Если вы выполняете передачу сообщений, я настоятельно рекомендую использовать очереди сообщений. Они очень просты в использовании (как только у вас есть привязки), и имеют хорошую производительность. Если вам нужно "поделиться" с каким-то ресурсом, вы, вероятно, захотите придерживаться общей памяти.
Похоже, что у вас есть какая-то клиентская/серверная вещь, я бы сказал, что использую либо очереди сообщений, либо сокеты домена unix, либо именованные каналы. Все они связаны с копированием данных в ядро, поэтому они не так быстры, как разделяемая память, но они все еще очень быстрые. Если у вас есть сообщения, подобные данным (отдельные небольшие пакеты), перейдите в очередь сообщений. Это, наверное, самое чистое решение. Если у вас больше потока данных, используйте трубы или сокеты. Сокеты имеют то преимущество, что вы можете легко сделать его прозрачным в сети (например, X11) позже, если хотите, но с ними немного сложнее работать, чем с трубами. Производительность, вероятно, очень похожа.
Ответ 3
Хотя, вероятно, не самый эффективный, Java поддерживает только сокеты из коробки (лучшее, что я помню). Они очень гибкие, возможно, не так быстро, как другие варианты. Как упомянуто Zifre, это дает вам возможность прозрачности сети, а также прозрачности языка/привязки; так как почти каждый язык поддерживает библиотеку сокетов из коробки в эти дни.
В то время как я выбрасываю эффективность из окна, если вы хотите перейти на следующий уровень, вы, вероятно, можете обернуть это в какой-либо веб-службе. Используйте встроенный веб-сервер для потребителя, чтобы производители подавали свои данные.
Ответ 4
Самый простой способ общения между приложениями, написанными на разных языках, - IMHO CORBA. Там есть очень хороший open source CORBA ORBs. Мы используем TAO для С++ и JacORB для Java. Существуют также компании, такие как OCI и средство устранения, которые предоставляют технической поддержки.
Ответ 5
В настоящее время я использую общую память для IPC между приложениями Java и С++, но ищем более удобную альтернативу.
Может ли кто-нибудь советовать лучший метод, но с той же скоростью?
Для простой общей памяти вам даже не нужна специальная библиотека:
class Main {
private static class CustomThread extends Thread {
public int x = 0;
public void run() {
x = 5;
}
}
public static void main(String[] args) {
CustomThread t = new CustomThread();
t.start();
System.out.println(t.x);
System.out.println(t.x);
}
}
Локальная переменная x доступна за пределами потока и внутри, позволяя вам использовать ее для передачи информации в поток и из него.