|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
Похоже, что задача не настолько тривиальна, как может показаться. Стоит задача написать примитивный сервис, который будет считать рейт событий. Событие будет его вызывать и увеличивать счетчик. Код: java 1.
Потом в другом месте нужно получить данные, какая скорость событий (события в секунду). Код: java 1.
Идей, конечно, много. Но не хотелось бы городить городушки. Самое простое, как мне видится хранить в следующем виде: Код: java 1.
где String - имя события ключ списка - секунда (от 0 до 59) в которую происходит событие ну и значение списка - это число событий По сути лист будет записываться по кругу, только вот вопрос с обнулением, где и как это делать при конкурентном доступе. Может есть способ лучше? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 12:11 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
Код: java 1.
Этот способ мне кажется перспективным, так как можно получать число событий в секунду (выдаем всегда предыдущую, так как текущая заполняется в данный момент времени), число событий в минуту (сумма всех событий). Можно адаптировать и к другим интервалам. А может есть либа какая уже готовая? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 12:13 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
Hett Код: java 1.
Это в принципе работать не будет, без внешней синхронизации. И ConcurrentHashMap взять тоже нельзя, потому что там read всего лишь eventually-consistent. Непонятно сколько ивентов ожидается, сколько нод, как они будут синхронизированы. Если одна нода и ивентов не дикое количество, то может тупо synchronized или ReadWriteLock? Прежде чем наворачивать, надо бы померять на реальной нагрузке ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 12:32 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
Одна нода и точность подсчета не критична. Код: java 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.
Как-то так получилось. ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 14:16 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
Имхо переусложнено, да и не совсем правильно, если уж на то пошло. Но, если авторточность подсчета не критична. то в принципе работать будет. Что мне здесь не нравится - 1) В конструкторе стартовать потоки это моветон, в вашем случае все будет ок, но вообще возможна ситуация, когда поток заснет до выхода из конструктора, а ваш шедулер запустится на выполнение над недоинициализированным объектом 2) Вы наивно полагаете, что код executorService.scheduleAtFixedRate(() -> (), 1, 1, TimeUnit.SECONDS); будет вызываться наносекунда в наносекунду? Твкую точность никто не гарантирует - так что идем к 3) 3) Я бы кажому ивенту ассайнил бы таймстамп, и складывал бы их один за одним в некую структуру данных, другой поток в оффлайне уже бы разбивал их на секунды и т.д Без всяких атомиков и т.п усложнений. Вообще много чего можно сказать, конечно, но я пожалуй закруглюсь ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 15:28 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
1. А как делать? Вызывать его инициализацию дергая отдельный метод? 2. Тут не те требования, чтобы прям до микро/нано секунд. Еще вроде возможна ситуация когда таймер будет обнулять счетчик, а этот счетчик еще будет выдаваться, потом только это понял. 3. Да, ваш способ проще и лучше. Я чет не догадался так, завтра может переделаю, если будет не лень. А что еще? Кстати не первый раз с таким сталкиваюсь, что из некоторых методов проще вернуть скалярный тип данных (чтобы не делать лишний боксинг), а где-то работаешь с объектным и возвращаешь его. На сколько это адекватно, что разные методы возвращают данные типы (где-то объект, где-то скаляр)? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 18:01 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
Hett1. А как делать? Вызывать его инициализацию дергая отдельный метод? Да, часто делают метод init() с такой логикой. А вместе где вызывается конструктор сначала делается new Object(); obj.init() Но это имеет минус конечно, логика размазанная и кто-то может забыть init(), зато потокобезопасно, тут каждый выбирает для себя. Hett2. Тут не те требования, чтобы прям до микро/нано секунд. Еще вроде возможна ситуация когда таймер будет обнулять счетчик, а этот счетчик еще будет выдаваться, потом только это понял. Да, именно так HettА что еще? Кстати не первый раз с таким сталкиваюсь, что из некоторых методов проще вернуть скалярный тип данных (чтобы не делать лишний боксинг), а где-то работаешь с объектным и возвращаешь его. На сколько это адекватно, что разные методы возвращают данные типы (где-то объект, где-то скаляр)? ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 18:22 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
случайно отправилось. авторА что еще? Да по-большому счету все, остальное - это уже из-за того что у вас архитектура навороченная, есть некоторые моменты но о них писать нет смысла, ибо если переделаете они уйдут. автор На сколько это адекватно, что разные методы возвращают данные типы (где-то объект, где-то скаляр)? Ну для обычной разработки некритично, но вообще это проблема, да. В высоконагруженных приложениях может выстрелить. Я сейчас на Scala, там такой проблемы особо нету, но если пишу на Java я по дефолту всегда ставлю int ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 18:25 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
Похоже на Meters ... |
|||
:
Нравится:
Не нравится:
|
|||
02.10.2018, 21:53 |
|
Подсчет числа событий в момент времени
|
|||
---|---|---|---|
#18+
fixxer, похоже, спасибо! ... |
|||
:
Нравится:
Не нравится:
|
|||
03.10.2018, 08:19 |
|
|
start [/forum/topic.php?fid=59&fpage=38&tid=2121739]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
42ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
59ms |
get tp. blocked users: |
2ms |
others: | 330ms |
total: | 475ms |
0 / 0 |