|
|
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Hi All, Есть библиотека стороннего производителя, позволяющая среди прочего сравнивать отпечатки пальцев. Эта библиотека вызывает DLL через JNI. Из-за нестабильности native-кода в DLL при вызове метода иногда убивается JVM. Соответственно, при вызове этой функциональности из томката у меня приблизительно раз в сутки валится томкат. Вопрос: как можно обособить вызовы из данной библиотеки (отдельное приложение?), чтобы при вызове не валились контейнеры, и в случае падения можно было бы все поднять? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 10:43:59 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
АфриканецИз-за нестабильности native-кода в DLL в других ЯП любой вызов оборачивают try и всё ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 11:08:55 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Petro123АфриканецИз-за нестабильности native-кода в DLL в других ЯП любой вызов оборачивают try и всё Не помогает ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 11:18:47 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Африканец, можно написать простенький веб-сервис и вызывать через него эту библиотеку, чтоб сам томкат не валился, а валилась только jvm этого сервиса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 11:18:55 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Африканец, Ну тоесть пишим отдельное приложение, которое представляет нам через веб-сервис требуемый функционал и это веб-сервис дергаем из томкат, если сервис лежит пробуем через томкат его поднять. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 11:25:04 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Судя по тому, что валится не только текущий поток, но и весь томкат, данная dll портит не только память потока, но и всего сервера. Подозреваю, что написана она без учета многопоточности, и при одновременном доступе возникают коллизии. Попробуйте сделать синхронизацию. Если не поможет, придется писать приложение-обертку, сервисы тут не спасут, они так же будут валить весь сервер. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 11:37:56 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
ivanra, вообще странно, что dll валит весь сервер. Что за детский сад. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 12:08:59 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Petro123АфриканецИз-за нестабильности native-кода в DLL в других ЯП любой вызов оборачивают try и всё Petro, хватит советовать всякую хрень. В случае segfault в нативном коде, jvm завершает свою работу с coredump'ом, какие try-catch. Вот GregTk дело сказал - надо, чтобы эта библиотека вызывалась в другом процессе. Можно по RPC, но если там простая передача аргументов, то и Runtime.exec() вполне хватит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 12:19:36 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Petro123ivanra, вообще странно, что dll валит весь сервер. Что за детский сад. Можно свалить любой процесс, если иметь полный доступ к его памяти, а dll его имеет. От банального стирания объектов в куче, до изменения исполняемого кода. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 12:19:42 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Petro123вообще странно, что dll валит весь сервер. Что за детский сад. Это нормально. JVM реализована так, чтобы максимально перехватывать и обрабатывать все исключения на системному уровне. DLL же работает на нативном уровне вне JVM и может делать что угодно с процессом. Поэтому все ошибки не перехваченые на нативному уровне убивают процесс (по крайней мере под виндой). В некоторых случаях можно написать нативную обертку, которая будет перехватывать и обрабатывать исключение. Но это не всегда возможно. Поэтому единственный нормальный способ, который все рекомендуют это запускать параллельные процессы. Лучше нативные, чтобы быстрее стартовали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 12:22:23 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
ivanraСудя по тому, что валится не только текущий поток, но и весь томкат, данная dll портит не только память потока, но и всего сервера. DLL не обязательно что-то портить. Почти любое неперехваченое нативное исключение приведет к крашу JVM. ivanraПодозреваю, что написана она без учета многопоточности, и при одновременном доступе возникают коллизии. Попробуйте сделать синхронизацию. Да, это достаточно стандартная проблема для legacy кода в dll. Но это всё равно не обезопасит сервер от других ошибок. Поэтому лучше всего таки запускать отдельные процессы. И многопоточность сохранится. ivanraЕсли не поможет, придется писать приложение-обертку, сервисы тут не спасут, они так же будут валить весь сервер. Нужно написать простейший exe, который через параметры командной строки будет запускать DLL функцию. Такие процессы можно почти спокойно плодить на сервере из разных потоков. Важно только чтобы они не утекали. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 12:29:26 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
rrrrrrrrВот GregTk дело сказал Ну, почти. Только нафига сервисы какие-то городить. Простейший exe нужен, чтобы новые процессы порождать максимально быстро и таким образом сохранить подобие многопоточности. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 12:31:06 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrrrrrrrrВот GregTk дело сказал Ну, почти. Только нафига сервисы какие-то городить. Простейший exe нужен, чтобы новые процессы порождать максимально быстро и таким образом сохранить подобие многопоточности. +1 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 12:38:18 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Сервис может быть эффективнее, если запуск всей этой конструкции занимает много времени, а вызывается она часто. От кейса зависит. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 12:57:15 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
rrrrrrrrСервис может быть эффективнее, если запуск всей этой конструкции занимает много времени, а вызывается она часто. От кейса зависит. GregTk говорил про "веб-сервис". "веб-сервис" будет подыматся заметно дольше чем легковестная обертка в виде exe. К тому же проблемы многопоточности этот сервис тоже не решит. Причин использовать windows service я тоже не вижу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 13:02:48 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Веб-сервис будет подниматься 1 раз, а exe придётся пускать каждый раз. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 13:06:33 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
rrrrrrrrВеб-сервис будет подниматься 1 раз При этом он будет подыматься порядка минуты и так же переодически крашится. rrrrrrrrа exe придётся пускать каждый раз. Стандартная проблема многих DLL библиотек в том что они не предназначены для многопоточного доступа вообще. Поэтому запускать exe каждый раз это единственный способ сохранить многопоточность. В противном случае все запросы от сервера придется выстраивать в очередь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 13:25:10 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczivanraСудя по тому, что валится не только текущий поток, но и весь томкат, данная dll портит не только память потока, но и всего сервера. DLL не обязательно что-то портить. Почти любое неперехваченое нативное исключение приведет к крашу JVM. ivanraПодозреваю, что написана она без учета многопоточности, и при одновременном доступе возникают коллизии. Попробуйте сделать синхронизацию. Да, это достаточно стандартная проблема для legacy кода в dll. Но это всё равно не обезопасит сервер от других ошибок. Поэтому лучше всего таки запускать отдельные процессы. И многопоточность сохранится. ivanraЕсли не поможет, придется писать приложение-обертку, сервисы тут не спасут, они так же будут валить весь сервер. Нужно написать простейший exe, который через параметры командной строки будет запускать DLL функцию. Такие процессы можно почти спокойно плодить на сервере из разных потоков. Важно только чтобы они не утекали. Простейший exe здесь не подходит, т.к. параметры - 2 byte[] массива порядка 10 килобайт. Можно было бы запустить отдельное приложение (мультитредовое с синхронизацией доступа к внешней библиотеке); если падает - поднимать. С другой стороны, можно попробовать синхронизировать доступ к библиотеке в томкате, что я и собираюсь сделать. Насчет веб-сервисов согласен с предыдущими ораторами: это не вариант. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 15:53:57 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
АфриканецПростейший exe здесь не подходит, т.к. параметры - 2 byte[] массива порядка 10 килобайт. Base64, можно просто через файлы передавать, или другой shared ресурс. АфриканецМожно было бы запустить отдельное приложение (мультитредовое с синхронизацией доступа к внешней библиотеке); если падает - поднимать. Какой в нём смысл? АфриканецС другой стороны, можно попробовать синхронизировать доступ к библиотеке в томкате, что я и собираюсь сделать. Это во-первых исключит возможно выполнять сравнение одновременно для разных юзеров (соотвественно уменьшит производительность). А во-вторых так же не гарантирует от падений. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 16:35:12 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, я конечно немного перегнул в понятиях в моём понимании web-service это то что можно вызвать через http например через get или post запросы, я конечно не имел ввиду юзать SOAP во весь рост. А банально взять jetty или вообще обойтись и самой JDK и обернуть все в сервис, который можно дергать по HTTP. Такое решение будет подниматься быстро и работать надежно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 17:02:44 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczАфриканецМожно было бы запустить отдельное приложение (мультитредовое с синхронизацией доступа к внешней библиотеке); если падает - поднимать. Какой в нём смысл? Коннектиться к приложению хоть по TCP и передавать туда параметры, получать обратно результат сравнения. Если коннект/вызов не получается или результат не приходит - считаем приложение упавшим (не обязательно по причинам параллельного доступа) и перезапускаем. BlazkowiczАфриканецС другой стороны, можно попробовать синхронизировать доступ к библиотеке в томкате, что я и собираюсь сделать. Это во-первых исключит возможно выполнять сравнение одновременно для разных юзеров (соотвественно уменьшит производительность). А во-вторых так же не гарантирует от падений. Да, от падений по причинам, отличным от параллельного доступа, не гарантирует. С другой стороны, процесс все равно интерактивный, так что лишние миллисекунды ожидания на границе вполне приемлемы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 17:03:38 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrrrrrrrrВеб-сервис будет подниматься 1 раз При этом он будет подыматься порядка минуты и так же переодически крашится. А кстати почему он будет подниматься порядка минуты? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 18:56:44 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
rrrrrrrrА кстати почему он будет подниматься порядка минуты? :) А все современные реализации SOAP Web Service достаточно тяжеловесны. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 18:59:35 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
BlazkowiczrrrrrrrrА кстати почему он будет подниматься порядка минуты? :) А все современные реализации SOAP Web Service достаточно тяжеловесны. Ну, минута это перебор. Полноценное приложение с SOAP (один внешний сервис) со spring и hibernate на машине разработчиков стартует за 15 секунд, а на production 5с. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 19:46:43 |
|
||
|
Как обособить нестабильный код?
|
|||
|---|---|---|---|
|
#18+
LeonidvBlazkowiczпропущено... А все современные реализации SOAP Web Service достаточно тяжеловесны. Ну, минута это перебор. Полноценное приложение с SOAP (один внешний сервис) со spring и hibernate на машине разработчиков стартует за 15 секунд, а на production 5с. От приложения зависит. Наше стартовало 5 минут. Прогревало кеши. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.01.2013, 20:01:26 |
|
||
|
|

start [/forum/topic.php?fid=59&msg=38108997&tid=2130190]: |
0ms |
get settings: |
14ms |
get forum list: |
19ms |
check forum access: |
5ms |
check topic access: |
5ms |
track hit: |
51ms |
get topic data: |
20ms |
get forum data: |
5ms |
get page messages: |
109ms |
get tp. blocked users: |
3ms |
| others: | 314ms |
| total: | 545ms |

| 0 / 0 |
