Y3Codec Explainer
На рынке нет эффективного кодека для работы с постоянным соединением. Например, Protocol Buffers ориентирован на работу с данными в автономном режиме, в то время как пользователи сталкиваются с обработкой данных в реальном времени, которые генерируются с высокой частотой, а изменение структуры данных происходит редко.
При декодировании другие кодеки выполняют полное декодирование, и пользователям приходится получать полный пакет данных, прежде чем они смогут начать процесс декодирования, что неэффективно при обработке данных в реальном времени.
Сценарий Y3 заключается в обработке потока данных в реальном времени при постоянном соединении, поэтому пользователь передаёт необработанный поток данных Y3 и затем указывает Y3 наблюдать за определённым ключом. После получения необработанного потока Y3 начинает операцию парсинга. Когда ключ будет обнаружен, Y3 декодирует значение указанного типа и запускает функцию обратного вызова.
Y3 описывает объект как набор структур TLV. При декодировании пакетов он может заранее определить, является ли текущий T наблюдаемым ключом, и решить, следует ли перейти к следующему набору структур TLV напрямую, без ненужных операций декодирования для ненаблюдаемых пакетов. Таким образом, Y3 может повысить эффективность декодирования и использование ресурсов.
Основные интерфейсы включают:
type SourceData struct {
Name string `y3:"0x10"`
Noise float32 `y3:"0x11"`
Therm Thermometer `y3:"0x12"`
}
type Thermometer struct {
Temperature float32 `y3:"0x13"`
Humidity float32 `y3:"0x14"`
}
func main() {
input := SourceData{
Name: "yomo",
Noise: float32(456),
Therm: Thermometer{Temperature: float32(30), Humidity: float32(40)},
}
// кодируем данные в формате Y3-Codec
codec := y3.NewCodec(0x20)
inputBuf, _ := codec.Marshal(input)
fmt.Printf("inputBuf=%#v\n", inputBuf)
}
func main() {
// определяем функцию обратного вызова для обработки наблюдаемых данных
callback := func(v []byte) (interface{}, error) {
return y3.ToFloat32(v)
}
// создаём интерфейс Observable
source := y3.FromStream(bytes.NewReader(inputBuf))
// подписываемся на наблюдаемый ключ и устанавливаем функцию обратного вызова
consumer := source.Subscribe(0x11).OnObserve(callback)
// проверка данных после их обработки
for c := range consumer {
fmt.Printf("observed value=%v, type=%v\n", c, reflect.ValueOf(c).Kind())
}
}
Диапазон ключа, на который подписываются:
0x10 ~ 0x3f
;0x01 ~ 0x0f
.Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )