|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Кейс: - есть, допустим 4 приложения (A,B,C,D) с неким типизированным списком, например электронная очередь в магазине, или список автобусов в автопарке - 4 (и более) приложения выполняются на разных компьютерах - нет возможности использовать сервер или облако к которому все могут подключиться, есть доступ между A&B и B&C и C&D - возможна ситуация когда, например B & C в данной цепочке - "серверы" разных отделов задача: синхронизировать список в памяти между всеми приложениями со скоростью задержки до 3..4 сек Существует ли подобное готовое решение? как компонент для встройки в .NET Framework приложение. вариации СУБД с их синхронизациями не подходят: - по большей части слишком медленно - тяжеловесно (должно работать и на тухлых клиентских машинах) возможно кто-то подскажет как правильно гуглить на английском, вариации "sharing memory over network" не дают нужных результатов ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2020, 14:15 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Гугли "Репликация БД", это теория по твоей задаче. Первоисточник списка где находится? Если все узлы могут менять список, то возможны конфликты. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2020, 15:35 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Dima T Гугли "Репликация БД", это теория по твоей задаче. Первоисточник списка где находится? Если все узлы могут менять список, то возможны конфликты. все должны должны менять и у каждого еще своя база в которую все изменения должны записываться похоже наиболее близкое что есть как nuget пакет это 'distributed cache' Я в нескольких таких покопался, и там больше про надстройку над Caching Memory или Redis. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 10:07 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Кифирчик, Что то похожее было, использовали Redis, ( в промышленной решении ) ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 11:17 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2020, 16:32 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Получается, что и различные Cache managers, distributed caches и MassTransit это обертки над "промышленными" системами - Redis, MongoDB, RabbitMQ, ActiveMQ (облака в расчет не берем). То есть писать свой компонент который что-то там в памяти будет синхронизировать между парой машин, это одно. Если же такое решение пытаться масштабировать как по количеству узлов так и по нагрузке - то сделать что-то надежно работающее довольно проблематично. Соответственно за это не берутся, а если берутся то получив нагрузку и кучу граблей быстро снимают колеса с самописного велосипеда и переползают на что-то вроде Redis/RabbitMQ и обертки над ними, в которых уже разрешили проблемы связанные с синхронизацией. Есть ошибки в рассуждении? Возвращаясь к моей задаче, я правильно понял как должно выглядеть использование MassTransit? (приложенный рисунок) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.08.2020, 13:40 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Кифирчик Фиг знает, неизвестно пока какие задачи решаются, почему такая архитектура, чем она обусловлена, и какие перспективы у данного комплекса в дальнейшем. А также непонятно, какого рода сообщения вы там слать собираетесь, сколько их в ширину и глубину, какие требования к нагрузке, какие требования к отказоустойчивости, к надёжности, какое влияние у распространение изменений, какие у вас предусмотрены стратегии к восстановлению после сбоя и и т.д. и т.п. Обычно, когда этих знаний нет, пользуются простыми и проверенными решениями. Чтобы потом не рвать волосы на голове :) Поглядите ещё сюда: https://github.com/rebus-org/Rebus ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2020, 00:22 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
>Кифирчик,27 авг 20, 14:15 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1328630&msg=22188102][22188102] >...Существует ли подобное готовое решение? < Не знаю, существует ли и насколько важна эта задача. Используя WCF можно объединить приложения (компы) в логическое информационное кольцо и передавать по оному текущие изменения, добавляя префикс генерирующего приложения в тело сообщения. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2020, 02:16 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
сейчас дорабатывается велосипед с синхронизацией через WCF с callback для синхронизации выбрана такая "стратегия": - у каждого сервера есть как WCF "сервер" так и WCF "клиент" - каждые два узла относятся друг к другу как мастер/слэйв - один из серверов обозначается как primary мастер - если сервер работает как слэйв, то поступившие запросы транслируются мастеру, то есть по сути слэйв это прокси к мастеру - любое изменение данных транслируется на мастер и меняет таблицу в памяти на мастере - после обновления на мастере, через callback всем рассылаются пакеты изменений, которые меняют таблицу в памяти слэйва и делают фикс в БД слэйва - перед изменением записи (на мастере) берется блокировка, которую соответственно два клиента получить не могут - если слэйв теряет подключение к мастеру, то он начинает выполнять команды у себя, то есть работать как мастер. такой подход позволяет избежать одновременного изменения записей, решает проблему синхронизации, но вносит заметные задержки, так как по сути все действия выполняются на одном сервере, все остальные получают "изменения", только сервера пишут их в базу, а клиенты отображают пользователям. >>логическое информационное кольцо у нас получается логическое информационное дерево ) текущие объемы микроскопические по меркам Redis/RabbitMQ, до 4х серверов в цепочке и до 5 клиентов на каждом. нагрузка тоже микроскопическая, максимум 3..4 добавления/обновления в секунду. среднее - примерно 1 запрос на добавление/обновление в 2..4 минуты. по времени больше упираемся в сохранение на SQL сервере. конечно у тех кто дальше всего от primary мастера заметно растут задержки с дальнего конца цепочки, после добавления/обновления строки до появления изменений может до 3х секунд пройти (обычно 1..2сек), что конечно многовато но заказчика устраивает. остались не до конца решенные грабли с разрывами связи. подумал что может есть готовое решение которое не попало в поле зрения когда все это затевали судя по всему вариант с RabbitMQ + MassTransit не сильно будет отличаться от WCF, без прослойки между table in memory и синхронизацией через очереди сообщений не обойтись. По сути это поменять "транспорт" с WCF на RabbitMQ. Также нужно будет кого-то делать "главным сервером", чтоб одну запись не начали редактировать, и если не менять "стратегию" задержки будут вряд ли заметно меньше. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.08.2020, 23:56 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Кифирчик, Распределённые решения и блокировка не совместимы. Чтобы лучше понять, как всё будет происходить, представьте себе 4 офиса на 4 этажах и сотрудников, которые перемещаются только между двумя выбранными ближайшими офисами. Данные переносятся на флешке. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 07:03 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
>Кифирчик, вчера, 23:56 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1328630&msg=22189666][22189666] >сейчас дорабатывается велосипед с синхронизацией через WCF с callback... < Если будет время, рассмотрите и иной вариант транспортировки изменений между узлами, с использованием двух путей: 1. Каждый узел на каждом пути имеет промежуточное место хранения информационных пакетов изменений - видимо лучший вариант есть циклический массив. 2. Есть первый путь (а-ля Москва-Питер) A --> B --> C --> D доставки. Здесь B (C,D) через WCF обращается к методу удаленного сервиса A(B,C,D) и "висит" там в "спящем" состоянии, ожидая поступления инфопакета изменений. Каждый узел на этом пути имеет три потока: - обработка инфопакетов от левого узла с записью оных в циклический массив (если сам его сгенерировал) и будит два других потока: а) потока смысловой обработки инфопакетов изменений б) потока соответствующего правого слейва 3. Второй путь (а-ля Питер-Москва) D --> C --> B --> A На этом пути в узлах D,C,B обработка инфопакетов не производится, только транспортировка. 4. Видимо между каждыми двумя узлами на каждом из путей надо пересылать тестовые инфопакеты 5. И причем здесь велосипед - решается нормальная задача, чего себя то морально гнобить. Или Вы реально думаете, что индусы и пиндосы решат её лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 12:09 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
hVostt Распределённые решения и блокировка не совместимы. Чтобы лучше понять, как всё будет происходить, представьте себе 4 офиса на 4 этажах и сотрудников, которые перемещаются только между двумя выбранными ближайшими офисами. Данные переносятся на флешке. ок, а если все сотрудники 16-ти офисов перемещаются между 4-мя этажами и 16-ю офисами? "распределенное решение" - понятие относительное в одном случае может быть овердохрена нагрузка и нужен упор на масштабируемость, чтоб добавить в кубернетисе три ноды и оп... обрабатывалось 10к запросов в секунду, а стало 30к в другом, каждый из 16-ти офисов работает со своим набором данных но нужно единое НСИ и начальство хочет "единую базу" чтоб смотреть репорты по всем, в третьем случае 16 офисов работают с одним набором данных, и быстродействие должно быть примерно как когда несколько пользователей редактируют гугл док, правишь один абзац сам, и видишь как дописывается следующий другим пользователем, или это диспетчерская аэропорта и буквально в реалтайм нужно видеть как меняются данные. и, как мне кажется, для этих трех примеров более оптимальны свои решения. наверно для первого случая - "промышленные" решения - Redis/MongoDb/RabbitMQ и т.д.. а ещё лучше что-то облачное для второго хватит и репликации основной СУБД. для третьего, нужно что-то... типа гугл документов. ВМоисеев Если будет время, рассмотрите и иной вариант транспортировки изменений между узлами, с использованием двух путей: ... Каждый узел на этом пути имеет три потока: - обработка инфопакетов от левого узла с записью оных в циклический массив (если сам его сгенерировал) и будит два других потока: а) потока смысловой обработки инфопакетов изменений б) потока соответствующего правого слейва если я вас правильно понял то: - если добавить в ваше уравнение условие что на тех узлах которые серверы, изменения нужно коммитить в БД и в таких случаях "смысловая обработка" будет выполняться почти всегда; - с другой стороны, есть пакеты которые не фиксятся в БД, к примеру установка блокировки, они сразу транслируются, это очень быстро происходит, в вашей терминологии это "путь 2" - циклический массив - это очередь видимо - 3 потока не нужно, 2х достаточно инфопакеты получаются из калбека и сразу кладутся в одну или 2 очереди, одна на отсылку своим клиентам/наблюдателям, другой для модификации данных в памяти и коммита в БД - получается сейчас все работает примерно как вы и написали. ВМоисеев 5. И причем здесь велосипед - решается нормальная задача, чего себя то морально гнобить. Или Вы реально думаете, что индусы и пиндосы решат её лучше? если индус решает эту проблему уже 9-й год - его решение будет лучше моего ))) если речь идет о промышленном решении, то оно определенно будет надежнее работать чем свой код. 1. Сейчас вот понимаю, что большая проблема не в том чтоб синхронизировать данные в двух UI табличках в ОЗУ у пользователя, грабли в другом: - а если в базу какого-то узла не удалась запись? таймаут/дедлок/FK руганулся... как это обработать чтоб для все кейсов было корректно? - а если был разрыв связи, данные в базах рассинхронизировались, и нужно и как-то синхронизировать и чтоб пользователи не переставали работать - а если был разрыв и сервера автономно поработали, пол дня к примеру? и могли по сути одинаковые записи создать... как всю эту хрень потом мержить? - а если был разрыв, сам главный мастер не работал, и 2..3 ноды начали накатывать свои изменения одновременно? то есть есть большие траблы с поддержанием синхронности данных и обработкой разрывов связи. у меня все это тесно coupling и я ошибочно думал что если саму синхронизацию таблицы в памяти вынести то код станет в двое проще. но наверно правильное распределение сложности - 15% синхронизация таблицы в памяти и 85% синхронизация данных в БД. 2. У программистов (у меня тоже) есть плохая черта не смотреть по сторонам а делать свои велосипеды потому что это банально может быть интересно, увидел задачу и вызов в ней, нырнул, не до конца поняв глубину проблемы. Можно к примеру сделать свою обертку на SQL или WCF запросом чтоб ловить специфичные ошибки и повторять запрос при дедлоках, но лучше бы разобраться и применить Polly. Так что это не "морально гнобить") Нужно себя всегда перепроверять, я к примеру вот вопрос на форуме задал, какашек вроде ни кто особо не накидал))) 3. в моем случае, из того что я вынес из этого топика и накопал по наводкам, велосипед видимо оправдан: - нужна почти реалтайм работа по общим данным всеми пользователями и автоматизацией, проблемы с масштабирование нагрузки нет - надежных решений которым года 4 от роду, у которых 40К скачиваний на NuGet и которые возьмут на себя хотяб 60..70% проблем и будут внутри твоего exe - похоже что нет. - использование близколежащих промышленных решений снимает 15% проблем, остальное останется, и что-то мне подсказывает задержки меньше не станут. - есть MSSQL к которому мы привязаны, и доп СУБД (например Redis) или броккер RabbitMQ для того чтоб синхронизировать табличку выглядит громоздко, там ещё зависимости тянутся... тоже растет сложность но в другом месте. для развертывания, с одной стороны нужно просто скопировать папку и запустить exe, и можно тестить к примеру, с другой, набор дополнительных компонентов подтянуть и их настроить - это много более трудоемко. ... |
|||
:
Нравится:
Не нравится:
|
|||
31.08.2020, 21:04 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Вот это поток сознания... Может уже пример забабахаете простейший? Это будет лучше тысячи слов. ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 01:02 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
>Кифирчик, вчера, 21:04 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1328630&msg=22190033][22190033] >...если я вас правильно понял то:... < В своё время поигрался с дуплексным каналом и отказался. Предлагаю вариант информационного кольца и в этом варианте нужно 3(три) потока - поток WCF клиента (пишет в циклический массив), поток WCF сервера (читает из циклического массива) и поток "смысловой обработки" (обработка информации из циклического массива). Циклический массив работает как демпфер и частично решает вопрос - а если был разрыв связи, данные в базах рассинхронизировались, и нужно и как-то синхронизировать и чтоб пользователи не переставали работать ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 01:40 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
hVostt Вот это поток сознания... видимо следствие долгой работы на удаленке без дебатов в курилке))) hVostt Может уже пример забабахаете простейший? Это будет лучше тысячи слов. дюже большой примерчик получится, спойлеров не напасемся ) если только вынести синхронизацию в отдельную прослойку и проектом на гитхаб ВМоисеев В своё время поигрался с дуплексным каналом и отказался. Вы про WCF+callback? чем вам он не понравился? ВМоисеев Циклический массив работает как демпфер и частично решает вопрос - а если был разрыв связи, данные в базах рассинхронизировались Спорное утверждение ))) - как долго хранить пакеты в циклическом массиве в случае разрыве связи? - а если клиентов несколько, один отключился только что, с другим 20 минут нет связи? каждому клиенту свой циклический массив? ... |
|||
:
Нравится:
Не нравится:
|
|||
01.09.2020, 22:35 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Кифирчик 2. У программистов (у меня тоже) есть плохая черта не смотреть по сторонам а делать свои велосипеды потому что это банально может быть интересно, увидел задачу и вызов в ней, нырнул, не до конца поняв глубину проблемы. Можно к примеру сделать свою обертку на SQL или WCF запросом чтоб ловить специфичные ошибки и повторять запрос при дедлоках, но лучше бы разобраться и применить Polly. Так что это не "морально гнобить") Нужно себя всегда перепроверять, я к примеру вот вопрос на форуме задал, какашек вроде ни кто особо не накидал))) Хорошая черта -- находить готовые решения и применять их на практике :) ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2020, 01:32 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
>Кифирчик, вчера, 22:35 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1328630&msg=22190601][22190601] >… Спорное утверждение ))) … каждому клиенту свой циклический массив? < Может быть и спорное. В циклический массив только пишут по единому указателю, а читать каждый пользователь может по своему личному. Так что циклический массив может быть един для всех клиентов. Важен размер, дабы не было потери информации. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2020, 10:46 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
ВМоисеев, Вот и велосипеды кафки подъехали :) Предлагаю начать с изобретения колеса. Если что-то круглое -- оно катится, давайте развивать идею ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2020, 13:34 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
hVostt, не-не - круглое носить, квадратное - катать ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2020, 13:42 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Кифирчик 1. Сейчас вот понимаю, что большая проблема не в том чтоб синхронизировать данные в двух UI табличках в ОЗУ у пользователя, грабли в другом: - а если в базу какого-то узла не удалась запись? таймаут/дедлок/FK руганулся... как это обработать чтоб для все кейсов было корректно? - а если был разрыв связи, данные в базах рассинхронизировались, и нужно и как-то синхронизировать и чтоб пользователи не переставали работать - а если был разрыв и сервера автономно поработали, пол дня к примеру? и могли по сути одинаковые записи создать... как всю эту хрень потом мержить? - а если был разрыв, сам главный мастер не работал, и 2..3 ноды начали накатывать свои изменения одновременно? то есть есть большие траблы с поддержанием синхронности данных и обработкой разрывов связи. Это еще не все возможные проблемы. Автоматически они не решаются, только ручками разгребать после восстановления связи. Автоматом возможно только если все пишут в мастер, а оттуда получают обновления. При потере мастера копия переходит в режим readonly. И второй вариант - в качестве мастера выступает большинство. Например у тебя 4 базы из них одна отвалилась, внеся изменение в 3 можно быть уверенным что когда 4-я оживет, то ей останется только принять изменения сделанные большинством. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.09.2020, 14:49 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Еще поток сознания ))) Dima T Это еще не все возможные проблемы. Автоматически они не решаются, только ручками разгребать после восстановления связи. Автоматом возможно только если все пишут в мастер, а оттуда получают обновления. При потере мастера копия переходит в режим readonly. Хочется чтоб автоматически ))) Тема плавно перетекает в синхронизацию баз данных ) Проблему можно обобщить: большая вариативность ситуаций разрыва связи. Она на минуту может пропасть, может на 10 минут, на день, а может копию запустили с пустой базой. Эти случаи сложно однозначно детектировать а общий компромиссный алгоритм часто не самый удачный. На сейчас лучшее что удалось придумать и заставить работать такое: "Бизнес логика" выполняется на одном, остальные получают обновления. Если связь к главному рвется, то копия становится мастером. При разрыве связи между офисами пользователи должны продолжить работу на своем сервере. Когда связь восстанавливается, таблица "в памяти" для слэйва становится ReadOnly. У меня можно четко разделить "оперативные данные" от исторических. По этому после подключения слэйва к мастеру, таблица становится ReadOnly и в это время происходит синхронизация оперативных данных и таблиц от которых эти данные зависят. Это не затрагивая "таблицу в памяти", только по иерархии зависимостей между таблицами. что-то вроде своей репликации. "оперативных" записей порядка 300...400 (основной документ), для синхронизации я сперва в SQL формирую таблицы с хэшами, это по сути хоть и тяжелый но один запрос на каждый сервер, и обрабатываю только разницу. После, оперативные данные уже синхронны и перечитываем таблицу из базы в память, и включаем синхронизацию через WCF. и пользователи могут продолжить работу, данные и команды от внешних систем в это время копятся в таблицах-очередях. если разрыв по времени был небольшой - то это секунд 15...30 занимает, если база вообще пустая - несколько минут. через 5 минут после установления связи, когда прошла синхронизация оперативных данных, запускается фоновая синхронизация исторических данных в глубину на 1 месяц (с глубиной пока экспериментирую) и данных которые не требую online синхронизации. такое действие может и пару часов занять. получается, алгоритм на любое отключение и не оптимален, если разрыв был на 1 минуту, то можно синхронизировать быстрее (к примеру просто подтянуть последние Change пакеты за время разрыва, их может и не быть), а если база пустая - то bulk insert будет круче обработки "по документу" хоть и в несколько потоков. и продумать сразу логику оказывается не просто, к тому что описал выше я не сразу пришел, только как у заказчика поставили стенды и получили реальные данные. реальные данные = пока то что выдает автоматика, люди еще не начала использовать, и мне что-то подсказывает, что часть правил всплывет только тогда когда начнется тестовое эксплуатирование пользователями. да и 30 секунд (быстрая синхронизация после включения) - это вроде быстро, но если связь будет "моргать" каждые 5 минут - это будет жесть. пользователи слэйвов будут сильно грустить и ругаться. нужно улучшать, и для этого пока сделал задел: - пропитываем в документах office owner, когда это можно делать; - ведем историю удаленных записей, когда и на каком сервере (это уже в мержинге используется) - пишу время работы каждого сервера, чтоб отлавливать когда он был выключен/выключен. - в синхронизаторе SQL предусмотрел возможность разных политик (упрощенно): * правильная запись - либо та у которой UpdateDate свежее, если равен - то правильная на мастере (активная политика на сейчас) * правильная запись - у owner-а * правильная запись у мастера, синхронизация для архива (делаем зеркало мастера) надо бы ещё как-то для слэйвов в базу фиксировать когда подключен к мастеру, а когда был разрыв. и вот это все нужно как-то в одно уравнение свести ( Dima T И второй вариант - в качестве мастера выступает большинство. Например у тебя 4 базы из них одна отвалилась, внеся изменение в 3 можно быть уверенным что когда 4-я оживет, то ей останется только принять изменения сделанные большинством. В этом алгоритме уже получается не с 2 базами работать - мастер/слэйв, еще одно "измерение" добавляется - сколько нод в сети, как они друг к другу относятся, в какой степени засинхронизированности и какие там версии данных. Либо я вижу проблему там где её нет, либо что-то очень сложное и "хрупкое" на выходе должно быть. Хотя видимо аналогично распределенные криптовалюты работают, там ведь это как-то разрешили. ВМоисеев Может быть и спорное. В циклический массив только пишут по единому указателю, а читать каждый пользователь может по своему личному. Так что циклический массив может быть един для всех клиентов. Важен размер, дабы не было потери информации. Вы еще ранее описали логику передачи пакетов, я пытаюсь это на реализацию спроецировать, и несколько зависаю... - "циклический массив" с индивидуальным для клиента указателем и с тремя потоками без дуплексного канала звучит как реализация структур и моделей со сложностью заметно выше WCF+callback+ConcurrentQueue, поясните в чем профит? как это должно лечь на реализацию с WCF? - информационное кольцо - подразумевает что сервера связанны кольцом или что пакет проходит по иерархии серверов к главному а потом результат обратно в виде инфо-пакета? - "циклический массив" со своим указателем для каждого клиента, как он будет работать с учетом вариаций разрыва связи от пары секунд до нескольких дней? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2020, 00:59 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Кифирчик, Вы лучше расскажите как так получилось, что 4 машины могут быть связаны между собой друг с другом, но не в единой сети? Они там по серийному порту связаны что ли проводом от древней мышки? )) Дешевле будет избить палками админа и выгнать его ссаными тряпками, школы открыли -- пусть не прогуливает уроки. И что за "заказчик" такой? Может лучше с топологией сети разобраться? ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2020, 01:31 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
>Кифирчик, сегодня, 00:59 https://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=1328630&msg=22191229][22191229] >...Вы еще ранее описали логику передачи пакетов... < Рассматриваю эту ситуацию ...- нет возможности использовать сервер или облако к которому все могут подключиться, есть доступ между A&B и B&C и C&D Каждый узел (A,B,C,D) реализует функционал WCF сервиса. Связь узлов может быть реализована так: Узел B обращется к удаленному методу узла A за получением информации измениний. Удаленный метод проверяет цикличекий массив. Если есть не обработанная узлом B информация, то узел B получает порцию и хранит в своем циклическом массиве. Если узел A не содержит информации для B, то программа удаленного метода "засыпает" и ждет пополнения циклического массива. Операция пополнения "будит" программу удаленного метода. Величина временного разрыва соединения не играет роли - важен объем циклического массива. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2020, 02:12 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
Кифирчик Тема плавно перетекает в синхронизацию баз данных ) Это оно и есть, я сразу предложил ее поизучать 22188155 , хотя бы в части теории, а дальше отталкиваться от нее при постройке своего велосипеда. Кифирчик нужно улучшать, и для этого пока сделал задел: - пропитываем в документах office owner, когда это можно делать; - ведем историю удаленных записей, когда и на каком сервере (это уже в мержинге используется) - пишу время работы каждого сервера, чтоб отлавливать когда он был выключен/выключен. - в синхронизаторе SQL предусмотрел возможность разных политик (упрощенно): * правильная запись - либо та у которой UpdateDate свежее, если равен - то правильная на мастере (активная политика на сейчас) * правильная запись - у owner-а * правильная запись у мастера, синхронизация для архива (делаем зеркало мастера) А если у обоих записи правильные? Допустим в двух разъединенных БД изменили одну и туже запись, что делать когда связь восстановится? Автоматически невозможно разрешить все конфликты, точнее можно, но с потерей данных в некоторых случаях. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2020, 07:23 |
|
Синхронизация таблицы (в памяти) между приложениями по сети
|
|||
---|---|---|---|
#18+
hVostt Кифирчик, Вы лучше расскажите как так получилось, что 4 машины могут быть связаны между собой друг с другом, но не в единой сети? Они там по серийному порту связаны что ли проводом от древней мышки? )) Дешевле будет избить палками админа и выгнать его ссаными тряпками, школы открыли -- пусть не прогуливает уроки. И что за "заказчик" такой? Может лучше с топологией сети разобраться? Картинка с masstransit что я выше выкладывал помните? 2 крайние машины это клиенты, по середине - 2 сервера. подсистемы синхронизации между клиентом/сервером и между двумя серверами унифицированные. условно 2 офиса, то есть две подсети внутри которых "клиенты" должны работать со своим сервером. если шагнуть немного вперед по времени, также в каждой подсети должен быть резервный сервер. офисы территориально разнесены, между подсетями офисов канал связи который временами не работает. интернет не задействуется. сети изолированы, только серваки друг друга видят. мне кажется нормальная практика. заказчику нужно решение чтоб сотрудники обоих "офисов" работали как в одном. и что дешевле то? на один сервер всех завести? или вы про кластер на промышленных решениях? админы там толковые, но похоже всех временами палками пугает служба безопасности ) ... |
|||
:
Нравится:
Не нравится:
|
|||
03.09.2020, 08:35 |
|
|
start [/forum/topic.php?fid=20&fpage=8&tid=1398476]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
25ms |
get topic data: |
12ms |
get forum data: |
2ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 134ms |
0 / 0 |