Я работаю над веб-приложением (JavaScript + PHP) для компании такси. Мне нужно добавить расширенную систему оповещений, в которой каждый пользователь приложения (сотрудники компании) может указать, какой тип оповещения он хочет получить. Допустим, пользователь № 1 хотел отследить такси № 101 и получать уведомления, когда он входит в район любого клиента, и показывать свои данные. пользователь № 2 хотел получать оповещения, когда такси № 202 и такси № 303 заходят в зону любого клиента … и т. д.
Заметка. Есть много других случаев для оповещений, но я предпочитаю думать о теме один за другим.
Я начал царапать дизайн высокого уровня следующим образом:
- Я добавлю опцию оповещения для каждого такси в приложении.
- Пользователь № 1 выберет такси № 101, чтобы получать уведомления от.
- taxiID будет добавлен в таблицу БД с идентификатором пользователя.
- Выполняйте пакетную обработку каждые 3 часа, объединяя эту таблицу с другой таблицей, где есть позиции такси.
- Получить список позиций + области + идентификаторы пользователей (не уверен, какую технологию я должен использовать здесь, чтобы создать этот список).
- Скрипт для запуска и проверки каждой области из списка и получения информации о всех клиентах внутри нее.
- Соедините таблицу результатов из шага 6 с таблицей из шага 3
- Каждый раз, когда пользователь входит в систему, запускается скрипт, который проверяет таблицу и выводит информацию о том, что такси приближается к ним.
Мои вопросы:
Как я могу перевести эти шаги в реальный процесс разработки программного обеспечения? (точные приемы)
Должна быть техника, чтобы справиться со всей этой головной болью. представьте себе, что есть 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.
В сценарии каждый пользователь будет запрашивать разные оповещения для разных такси, и я должен выполнить некоторую обработку, а затем отобразить результаты для каждого пользователя.
Я не мог понять, как обрабатывать эти разные переменные и каково лучшее решение для этого случая.
Из интереса: зачем кому-то еще нужно получать оповещения?
К каким данным у вас есть доступ?
Вы всегда знаете позиции такси? Это 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)
Это имеет какой-то смысл для вас?
Из того, что вы говорите, похоже, что ваша система будет включать в себя мобильные устройства, и вам понадобится система карт для отслеживания.
Лучшее решение, которое я могу порекомендовать, это использовать что-то вроде Leaflet с API openstreetmap, это даст карту в виде svg с достаточным количеством XML-данных для отслеживания местоположений и простого js-скрипта, который будет использовать ajax для отправки данных о местоположении на сервер через заданные интервалы ,
Использование backbone js обеспечивает простое управление прослушивателем событий для ваших предупреждений. Просто нужно проверить местоположение такси против клиентской зоны при обновлении местоположения.
Список платформ OSM, включая Leaflet http://wiki.openstreetmap.org/wiki/Frameworks