Потребитель Kafka НЕ является поточно-ориентированным , вы не должны совместно использовать один и тот же экземпляр потребителя между разными потоками. Вместо этого вы должны создать новый экземпляр для каждого потока.
Из документации https://kafka.apache.org/0100/javadoc/org/apache/kafka/clients/consumer/KafkaConsumer.html#multithreaded :
1. Один потребитель на поток
Простой способ - дать каждому потоку свой собственный экземпляр клиента. Вот плюсы и минусы этого подхода:
blockquote>
- PRO: Реализовать проще всего
- PRO: Часто он самый быстрый, так как не требуется координация между потоками
- PRO: очень легко реализовать обработку по порядку для каждого раздела (каждый поток просто обрабатывает сообщения в порядке их получения).
- CON: Чем больше потребителей, тем больше TCP-соединений с кластером (по одному на поток). В общем, Kafka очень эффективно обрабатывает соединения, поэтому это, как правило, небольшая стоимость.
- CON: множественные потребители означают, что на сервер отправляется больше запросов и немного меньше пакетных данных, что может вызвать некоторое снижение пропускной способности ввода / вывода.
- CON: общее количество потоков во всех процессах будет ограничено общим количеством разделов.
Если тема имеет несколько разделов, сообщения из разных разделов могут обрабатываться параллельно. Вы можете создать несколько экземпляров-потребителей с одним и тем же group.id, и каждый из них получит подмножество разделов для потребления данных.
Kafka не поддерживает параллельную обработку по различным темам. Под этим я подразумеваю, что группы не управляются по разным темам, разделы из разных тем могут быть распределены неравномерно.
Недели начинаются в воскресенье
Это должно работать, даже если февраль не начинается в воскресенье.
function weekCount(year, month_number) {
// month_number is in the range 1..12
var firstOfMonth = new Date(year, month_number-1, 1);
var lastOfMonth = new Date(year, month_number, 0);
var used = firstOfMonth.getDay() + lastOfMonth.getDate();
return Math.ceil( used / 7);
}
Недели начинаются в понедельник
function weekCount(year, month_number) {
// month_number is in the range 1..12
var firstOfMonth = new Date(year, month_number-1, 1);
var lastOfMonth = new Date(year, month_number, 0);
var used = firstOfMonth.getDay() + 6 + lastOfMonth.getDate();
return Math.ceil( used / 7);
}
Недели начинаются в другой день
function weekCount(year, month_number, startDayOfWeek) {
// month_number is in the range 1..12
// Get the first day of week week day (0: Sunday, 1: Monday, ...)
var firstDayOfWeek = startDayOfWeek || 0;
var firstOfMonth = new Date(year, month_number-1, 1);
var lastOfMonth = new Date(year, month_number, 0);
var numberOfDaysInMonth = lastOfMonth.getDate();
var firstWeekDay = (firstOfMonth.getDay() - firstDayOfWeek + 7) % 7;
var used = firstWeekDay + numberOfDaysInMonth;
return Math.ceil( used / 7);
}
Ни одно из решений здесь действительно не работало на меня. Вот моя трещина в нем.
// Example
// weeksOfMonth(2019, 9) // October
// Result: 5
weeksOfMonth (year, monthIndex) {
const d = new Date(year, monthIndex+ 1, 0)
const adjustedDate = d.getDate() + d.getDay()
return Math.ceil(adjustedDate / 7)
}
Вы можете использовать мою библиотеку time.js . Вот функция weeksInMonth:
// http://github.com/augustl/time.js/blob/623e44e7a64fdaa3c908debdefaac1618a1ccde4/time.js#L67
weeksInMonth: function(){
var millisecondsInThisMonth = this.clone().endOfMonth().epoch() - this.clone().firstDayInCalendarMonth().epoch();
return Math.ceil(millisecondsInThisMonth / MILLISECONDS_IN_WEEK);
},
Это может быть немного неясно, поскольку основа функциональности находится в endOfMonth и firstDayInCalendarMonth, но вы должны хотя бы получить некоторое представление о том, как это работает.
Вам нужно будет его вычислить.
Вы можете сделать что-то вроде
var firstDay = new Date(2010, 0, 1).getDay(); // get the weekday january starts on
var numWeeks = 5 + (firstDay >= 5 ? 1 : 0); // if the months starts on friday, then it will end on sunday
Теперь нам просто нужно обобщить это.
var dayThreshold = [ 5, 1, 5, 6, 5, 6, 5, 5, 6, 5, 6, 5 ];
function GetNumWeeks(month, year)
{
var firstDay = new Date(year, month, 1).getDay();
var baseWeeks = (month == 1 ? 4 : 5); // only February can fit in 4 weeks
// TODO: account for leap years
return baseWeeks + (firstDay >= dayThreshold[month] ? 1 : 0); // add an extra week if the month starts beyond the threshold day.
}
Примечание: При звонке помните, что месяцы в javascript имеют нулевой индекс (т.е. январь == 0).
function weeksinMonth(m, y){
y= y || new Date().getFullYear();
var d= new Date(y, m, 0);
return Math.floor((d.getDate()- 1)/7)+ 1;
}
alert(weeksinMonth(3))
// диапазон месяцев для этого метода - 1 (январь)-12 (декабрь)