|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
Доброго времени суток. Решил поделиться с сообществом альтернативной технологией обмена данными между серверами Cache’ и сторонними языками программирования, поддерживающие Socket коннекты. https://github.com/MyasnikovIA/ZSrvController Для начала, немного о причине появления этой технологи: Появилась необходимость получать большие объемы данных между двумя серверами Cache’. Задача казалось бы простая, и решается стандартными методами, с применением вэб технологий, но при реализации, лично я столкнулся с подводными камнями. Главной проблемой стала ошибка “Таймаута”. Данные перед отправкой очень долго подготавливались. Можно включить мозг и начать оптимизировать предварительную подготовку данных, но было лень это делать, и я пошел другим путем. Был разработан контроллер, позволяющий прямое Socket соединение между серверами, а за одно и между любыми средствами разработки поддерживающие сокеты. Сервер поддерживает авторизацию и следующие команды: Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Проверить работу можно применив PuTTY.exe Если кого заинтересует этот контроллер, и появятся идеи, как улучшить код, буду рад внести изменения. Пример подключения между серверами, и выполнения MUMPS команды (взят из документации к классу) Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21.
Получить объект по ID Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13.
Получить объекты из Query запроса Код: html 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 12:28 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
MyasnikovIA, а вы не смотрели в сторону асинхронного взаимодействия? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 13:44 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
eduard93, Честно говоря нет. Даже не представляю как это сделать. Если подкините идею , буду очень признателен. Дело в том что данная технология работает еще в одном проекте. И если есть более гибкое решение, почему бы не модернизировать. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 16:34 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
Немного напомнило "MiniM InterConnect". Как и ваша разработка, это скорее [ещё одна] технология удалённого выполнения кода, чем обмена большими объёмами данных. Если просто обходить глобал по $Query() и на другой стороне принимать, данные будут передаваться медленно по сравнению, например, с ECP. Обмен можно ускорить, если передавать глобал блоками (либо разобравшись, как работают %GOF/%GIF, либо используя блоки собственного формата). Приходилось делать и то, и другое, последнее, правда, пока не реализовано в виде обмена через сокеты. Асинхронность: наверное, имелось в виду использование некоего фонового многопоточного механизма, такого как $system.WorkMgr.*, чтобы параллельно передавать сразу несколько глобалов; это, конечно, может ускорить пакетную передачу, но всё равно она завершится не раньше, чем передастся самый большой глобал. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 17:08 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
Alexey Maslov, Спасибо. я на днях попытаюсь разобраться с этими технологиями. А вообще существует стандартный метод передачи данных предусмотренный компанией Intersystems? (конечно же кроме журналов и файлов) Чтобы решать задачи аналогичной: 1) Подключится к уделенному серверу 2) Инициировать процесс 3) Дождаться окончания работы процесса 4) Забрать результат работы с удаленного сервера И желательно без ограничений по времени и объеме данных на любом этапе :) ... |
|||
:
Нравится:
Не нравится:
|
|||
05.12.2017, 18:14 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
MyasnikovIA, Готового "стандартного" метода не знаю. Обычно решается комбинацией самописного кода + ECP для удалённого доступа к глобалам. Мои терзания трёхлетней давности на эту тему отражены здесь . Текущая реализация API Util.Proc сильно отличается от той, что была опубликована вместе со статьёй: ради надёжности и скорости работы её пришлось гораздо сильнее привязать к нашему базовому инструментарию (qWORD). В итоге без qWORD теперь работают лишь функции удалённого выполнения кода (Util.Proc::CCM) и запуска/контроля за удалёнными процессами (Util.Proc::RunJob, CheckJob). Хочется это переписать, но времени пока нет. Сейчас бы делал на сокетах, и возможно добавил бы "экспресс-копирование" глобалов между произвольными серверами (блочное), не используя ECP. Да, и писал бы на стандартном M[umps]. Вспомнил байку, услышанную когда-то от пожилого сантехника. Учитель ему говорил: "Паша, делай хорошо. Х%ёво и так получится". ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2017, 11:21 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
MyasnikovIA, В году этак 2000 писал с целью передачи большого объема данных из Cache в клиентское приложение. Там через socket из Cache командой write шел поток бинарных данных. На сегодня для взаимодействия с Cache есть более продвинутые и унифицированные решения. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2017, 16:07 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
MyasnikovIAeduard93, Честно говоря нет. Даже не представляю как это сделать. Если подкините идею , буду очень признателен. Дело в том что данная технология работает еще в одном проекте. И если есть более гибкое решение, почему бы не модернизировать. Пример асинхронного REST взаимодействия: Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82. 83. 84. 85. 86. 87. 88. 89. 90. 91. 92. 93. 94. 95. 96. 97. 98. 99. 100. 101. 102. 103. 104. 105. 106.
Установка: 1. Загрузить код 2. Создать веб-приложение с REST брокером Utils.AsyncREST Как работать: Допустим веб-приложение называется /asyncREST. Сначала запускаем новое задание по адресу http://localhost:57772/asyncREST/StartTask В ответ нам придёт идентификатор задания: Код: sql 1.
Далее с любой периодичностью опрашиваем http://localhost:57772/asyncREST/GetTask/<TaskId> (в нашем случае http://localhost:57772/asyncREST/GetTask/12608 ). В ответ придёт текущий статус задания: Код: sql 1. 2. 3. 4. 5.
Когда задение выполнится при очередном опросе придёт результат: Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2017, 23:25 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
В первом ответе сервера было: Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2017, 23:26 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
Поправил на GitHub код так, чтобы TaskId всегда был Integer в JSON. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2017, 23:28 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
eduard93Пример асинхронного REST взаимодействия...Эдуард, новый Портал (v2018.1 / IRIS) будет его поддерживать? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2017, 12:09 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
Alexey Masloveduard93Пример асинхронного REST взаимодействия...Эдуард, новый Портал (v2018.1 / IRIS) будет его поддерживать?Лично я не вижу препятствий. Там не настолько кардинальные измения. И в этом примере не используется ничего из сколько нибудь специфичного типа WorkMgr или Event. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2017, 12:48 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
DAiMor, я не про пример, а про сам Портал. Сейчас он преимущественно синхронный. Например, просмотр переменных процесса заканчивается обычно нередко таймаутом. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2017, 14:38 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
Alexey MaslovDAiMor, я не про пример, а про сам Портал. Сейчас он преимущественно синхронный. Например, просмотр переменных процесса заканчивается обычно нередко таймаутом.Очень сомневаюсь, что там что-то делали в этом плане. Фокус думаю был больше на другом функционале. Портал давно правда уже не трогали. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2017, 15:06 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
DAiMor...не используется ничего из сколько нибудь специфичного типа WorkMgr или Event...Класс Event стабилизировался уже давно. Что касается WorkMgr, то действительно были серьёзные изменения между 2015.1 и 2017.1. Что-то новое появилось в этих классах в 2018.1? ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2017, 15:16 |
|
Организация обмена данными между серверами Cache' через Socket коннект (PuTTY.exe)
|
|||
---|---|---|---|
#18+
Будет работать начиная с 2016.2 как есть. Адаптировать для REST без динамических объектов (2014.2) или вообще без REST на CSP не представляется сложным. С выходом InterSystems IRIS Data Platform скорее всего будет работать как есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
08.12.2017, 17:12 |
|
|
start [/forum/topic.php?fid=39&msg=39566648&tid=1556294]: |
0ms |
get settings: |
12ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
41ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
52ms |
get tp. blocked users: |
1ms |
others: | 13ms |
total: | 150ms |
0 / 0 |