javascript — лучшая технология для обработки такой сложной системы, приложение Wep + тяжелая обработка

Я работаю над веб-приложением (JavaScript + PHP) для компании такси. Мне нужно добавить расширенную систему оповещений, в которой каждый пользователь приложения (сотрудники компании) может указать, какой тип оповещения он хочет получить. Допустим, пользователь № 1 хотел отследить такси № 101 и получать уведомления, когда он входит в район любого клиента, и показывать свои данные. пользователь № 2 хотел получать оповещения, когда такси № 202 и такси № 303 заходят в зону любого клиента … и т. д.

Заметка. Есть много других случаев для оповещений, но я предпочитаю думать о теме один за другим.

Я начал царапать дизайн высокого уровня следующим образом:

  1. Я добавлю опцию оповещения для каждого такси в приложении.
  2. Пользователь № 1 выберет такси № 101, чтобы получать уведомления от.
  3. taxiID будет добавлен в таблицу БД с идентификатором пользователя.
  4. Выполняйте пакетную обработку каждые 3 часа, объединяя эту таблицу с другой таблицей, где есть позиции такси.
  5. Получить список позиций + области + идентификаторы пользователей (не уверен, какую технологию я должен использовать здесь, чтобы создать этот список).
  6. Скрипт для запуска и проверки каждой области из списка и получения информации о всех клиентах внутри нее.
  7. Соедините таблицу результатов из шага 6 с таблицей из шага 3
  8. Каждый раз, когда пользователь входит в систему, запускается скрипт, который проверяет таблицу и выводит информацию о том, что такси приближается к ним.

Мои вопросы:

  1. Как я могу перевести эти шаги в реальный процесс разработки программного обеспечения? (точные приемы)

  2. Должна быть техника, чтобы справиться со всей этой головной болью. представьте себе, что есть 50 пользователей и более 5000 такси. Я думаю о слюнях и начал читать об этом, но все еще не уверен, как это подходит здесь.

Буду благодарен за любой намек.

РЕДАКТИРОВАТЬ

Спасибо, Александр. Вот ответы на ваши вопросы:

Q: why would any one user even need to get alerted?
A: I'm not sure. For generating reports or something like that.

Q: Do you always know the positions of Taxis?
A: Yes, The system receives real time positions through GPS

Q: Do you always know the positions of Users?
A: No, it's not important. thy are regular employees. I just need their IDs so I can show each one the info he asked for.

Q: How do you know what an 'area' is, and what determines if a user/taxi is in range?
A: When I get the position of the taxi, I draw a virtual zone around it and call it and area. It should inserted in the DB as well.

Q: are the rules predefined? Or must the user be able to create them dynamically?
A: Yes, they are predefined. There are many other rules such as [The user can choose to get alerted when specified taxi has not moved for a long time]. but I started with this one.

В сценарии каждый пользователь будет запрашивать разные оповещения для разных такси, и я должен выполнить некоторую обработку, а затем отобразить результаты для каждого пользователя.

Я не мог понять, как обрабатывать эти разные переменные и каково лучшее решение для этого случая.

-1

Решение

Из интереса: зачем кому-то еще нужно получать оповещения?

К каким данным у вас есть доступ?

Вы всегда знаете позиции такси? Это GPS? Драйверы добавляют / обновляют данные?

Вы всегда знаете позиции пользователей? Это GPS? Пользователи добавляют / обновляют данные?

Откуда вы знаете, что такое «зона» и что определяет, находится ли пользователь / такси в зоне действия?

ПОЦЕЛУЙ — Сохраняй это простым Шадин

Я предлагаю следующие объекты в вашей системе:

Taxi
+ id : int
+ positions : Position[]

User
+ id : int
+ username / password / email etc
+ observing : Taxi[]
+ rules : Rule[]

Rule
I do not know what you need or expect from this

Я не знаю, что вы имеете в виду под областью, но вам, вероятно, также нужна какая-то сущность для этого, хотя, возможно, нет в базе данных — я не знаю.

Теперь по правилам. Кажется, вам нужен домен-специфичный язык (DSL).

Тогда возникает вопрос, правила предопределены? Или пользователь должен иметь возможность создавать их динамически?

Если они предопределены, вы можете просто реализовать класс для этого правила и выполнить его в своем контроллере (или любом другом, который вы используете для обработки http-запросов), когда пришло время проверить это правило. Что-то вроде myRule.checkFor(user), Может даже быть какой-то рабочий процесс.

Я буду обновлять мой ответ, когда вы отвечаете на мои вопросы в качестве комментариев 🙂

РЕДАКТИРОВАТЬ:

Хорошо, я думаю, я начинаю чувствовать твою проблему. Это было бы моим решением:

REST API:

POST yoursite.com/v1/taxi/1.json {x:0.23, y:23} //update position for taxi 1 with json payload
POST yoursite.com/v1/user/1/register {taxi:1, eventType:NO_MOVEMENT, args:"3600"} //no mov for 1 hr
POST yoursite.com/v1/user/1/unregister {taxi:1, eventType:NO_MOVEMENT }

Мне кажется, этого должно быть достаточно для объединения нужных вам данных. Он отвечает на следующие вопросы:

Where are the taxis? Which user is looking for events on x taxi?

Вам понадобится стол (такси) для хранения идентификатора такси и его позиции. [taxiid: int, long: float, lat: float]

Вам понадобится таблица (слушатели) для хранения того, какое такси слушает, какими пользователями и для какого события. [userid: int, taxiid: int, event: enum, arguments: string]

Вам понадобится таблица (события), в которой хранится каждое событие. [eventid: int, eventType: enum, taxiid: int]

Следующим шагом в моем предложенном решении было бы иметь работника, непрерывно агрегирующего события на основе полученных данных. Скажем, вы определяете процесс NoMovement. Этот процесс выполняется с частотой, достаточной для определения минимально допустимого интервала в вашей системе. Для этого примера, давайте предположим, что мы могли бы бежать с 15-минутным интервалом (то есть, вы не заинтересованы в такси, которое стоит на месте 14 минут).

Теперь каждый из ваших процессов сможет хранить события в новой таблице в вашей базе данных. Давайте исследуем процесс NoMovement (который будет запускаться каждые 15 минут вашим работником):

For each $taxiid present in listeners@taxiid
Retrieve taxipos closest to now, and taxipos closest to 15 minutes ago (interval must be => to 15 minutes)
Check distance between now, and 15 minutes ago
If distance is <1 THRESHOLD (I don't know what this should be)
Add to event table with (eventType:NO_MOVEMENT, taxiid: $taxiid) you'll get that from the loop

Наконец, это просто вопрос

GET youriste.com/v1/events/taxiid (your client will need to store which taxiids we want to ask for events, and call get at an appropriate interval - your client should then locally set event by id as read and filter those out before alerting)

Это имеет какой-то смысл для вас?

1

Другие решения

Из того, что вы говорите, похоже, что ваша система будет включать в себя мобильные устройства, и вам понадобится система карт для отслеживания.

Лучшее решение, которое я могу порекомендовать, это использовать что-то вроде Leaflet с API openstreetmap, это даст карту в виде svg с достаточным количеством XML-данных для отслеживания местоположений и простого js-скрипта, который будет использовать ajax для отправки данных о местоположении на сервер через заданные интервалы ,

Использование backbone js обеспечивает простое управление прослушивателем событий для ваших предупреждений. Просто нужно проверить местоположение такси против клиентской зоны при обновлении местоположения.

Список платформ OSM, включая Leaflet http://wiki.openstreetmap.org/wiki/Frameworks

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector