|
|
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
Всем доброго дня. Прошу сильно не пинать, знаний пока что не хватает, поэтому спрашиваю у вас совета. Условие: Есть N датчиков (примерно 100). Датчики одновременно шлют данные по TCP протоколу с интервалом в <1 секунду. Задача: Необходимо записывать данные в таблицу (на Postgres) Вопрос : Как лучше реализовать запись данных? Варианты, которые пришли в голову: 1. Общий для всех потоков (1 датчик=1 поток) LinkedBlockingQueue. Добавление в очередь: Код: java 1. Отдельным потоком беру данные из очереди Код: java 1. и записываю в таблицу. 2. Для каждого потока свой синхронизированный список и одновременная запись в таблицу из всех потоков. Мне кажется, что оба варианта совсем не по фен-шую. Помогите пожалуйста советом. Заранее благодарю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 12:55:13 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
По-моему со стороны Java тут как ни сделай, будет вполне ОК. 100 сообщений в секунду, не так, много. Главное чтобы они как можно меньше друг друга блокировали. А вот над чем бы стоило подумать, так это над записью в Postgres. Какой размер сообщения? Какого размера будет база через неделю? Через месяц? Как при этом изменится скорость вставки? Нужна ли возможность архивации? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:12:59 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
Blazkowicz, Вопрос как-раз и в блокировках. А БД это уже другой вопрос:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:14:35 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
danatriel, 1 уровень - системный. Сбор в ОДИН список всех датчиков. Всё равно сколько потоков, но и 1 справится. 2 уровень - прикладной. 1 поток\процесс_из_файла пишет с этого списка. Итого 1 поток на прикладном уровне и 1 на системном. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:17:36 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
Я бы сделал одну очередь и пул с двух сторон. Чтобы можно было с каждой стороны настраивать сколько потоков обслуживают чтение датчиков и запись в базу. В базу конечно, же нужно писать большими батчами. Скорее всего в 1-2 потока. Проблема только в том что делать с аварийными ситуациями, когда вся очередь, которая в памяти теряется. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:19:13 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
Petro123, Один поток на системном уровне не получится сделать, т.к. читаю данные с датчиков через сокет, как только коннектится новый датчик к сокету, создается новый поток. Может это и не правильно, но другой реализации не знаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:21:25 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
danatrielBlazkowicz, Вопрос как-раз и в блокировках. А БД это уже другой вопрос:) Мне кажется 100 сообщений в секунду это фигня, даже Vector должен справится. Ну, конечно, же так делать не стоит. Нужна нормальная колекция с ReadWrite блокировкой. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:21:40 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
danatrielОдин поток на системном уровне не получится сделать, т.к. читаю данные с датчиков через сокет, как только коннектится новый датчик к сокету, создается новый поток. Может это и не правильно, но другой реализации не знаю. NIO ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:22:14 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
Netty + а в базе данных обязательно сделать сегментацию таблиц по временным промежуткам ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:33:17 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
Dan Blackа в базе данных обязательно сделать сегментацию таблиц по временным промежуткам +100 Данные потом еще и запрашивать надо будет. Или чисто для выборки/показа или для агрегирования (среднее за интервал, сумма). Без сегментации любой подобный запрос умрет ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:44:17 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
с чего она умрет при нагрузке 100 зап. в сек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 13:56:52 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
Petro123с чего она умрет при нагрузке 100 зап. в сек. с любого запроса типа select sum(показатель) за предыдущие сутки, например (или за предыдущий час). Обычно в таких случаях мгновенные данные нужны для агрегирования и работа потом ведется над агрегированными значениями. Только их еще успеть посчитать надо, так чтобы скорость обсчета была больше чем скорость записи исходных измерений в базу. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 14:02:39 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
sanBezPetro123с чего она умрет при нагрузке 100 зап. в сек. с любого запроса типа select sum(показатель) за предыдущие сутки, например (или за предыдущий час). Обычно в таких случаях мгновенные данные нужны для агрегирования и работа потом ведется над агрегированными значениями. Только их еще успеть посчитать надо, так чтобы скорость обсчета была больше чем скорость записи исходных измерений в базу. ну не знаю. Домысливать за автора не буду. Нагрузка как у всех БД. Обычная. Если БД неблокировочник, то там вообще в ней 1 поток пишет и не мешает читать. Удачи аффтару. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 14:06:14 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
Petro123, тестировал так: 100 потоков пишут по 10000 сообщений с интервалом 500 мс в очередь - из очереди данные пишутся в БД одним потоком,даже без использования батча. сделал запись в БД одним потоком - глюков вроде нет. Может вообще моя проблема надуманна и все так и оставить?:) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 14:31:07 |
|
||
|
Одовременная запись данных в таблицу БД
|
|||
|---|---|---|---|
|
#18+
danatrielМожет вообще моя проблема надуманна и все так и оставить?:) С точки зрения Java, да. Как уже написал выше, любое простое и адекватоное решение для указаной нагрузки не проблема. Т.е. наоборот. :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.02.2013, 14:35:41 |
|
||
|
|

start [/forum/topic.php?fid=59&fpage=243&tid=2129923]: |
0ms |
get settings: |
16ms |
get forum list: |
31ms |
check forum access: |
7ms |
check topic access: |
7ms |
track hit: |
55ms |
get topic data: |
19ms |
get forum data: |
5ms |
get page messages: |
80ms |
get tp. blocked users: |
3ms |
| others: | 348ms |
| total: | 571ms |

| 0 / 0 |
