Class: Karafka::Messages::Message

Inherits:
Object
  • Object
show all
Extended by:
Forwardable
Defined in:
lib/karafka/messages/message.rb

Overview

It provides lazy loading not only until the first usage, but also allows us to skip using deserializer until we execute our logic. That way we can operate with heavy-deserialization data without slowing down the whole application.

Instance Attribute Summary collapse

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(raw_payload, metadata) ⇒ Message

Returns a new instance of Message.

Parameters:



30
31
32
33
34
35
# File 'lib/karafka/messages/message.rb', line 30

def initialize(raw_payload, )
  @raw_payload = raw_payload
  @metadata = 
  @deserialized = false
  @payload = nil
end

Instance Attribute Details

#metadataObject (readonly)

Returns the value of attribute metadata.



21
22
23
# File 'lib/karafka/messages/message.rb', line 21

def 
  @metadata
end

#raw_payloadObject

raw payload needs to be mutable as we want to have option to change it in the parser prior to the final deserialization



24
25
26
# File 'lib/karafka/messages/message.rb', line 24

def raw_payload
  @raw_payload
end

Class Method Details

.parserObject

Note:

We cache it here for performance reasons. It is 2.5x times faster than getting it via the config chain.

Returns general parser.

Returns:

  • (Object)

    general parser



16
17
18
# File 'lib/karafka/messages/message.rb', line 16

def parser
  @parser ||= App.config.internal.messages.parser
end

Instance Method Details

#deserialized?Boolean

Returns did we deserialize payload already.

Returns:

  • (Boolean)

    did we deserialize payload already



49
50
51
# File 'lib/karafka/messages/message.rb', line 49

def deserialized?
  @deserialized
end

#payloadObject

Returns lazy-deserialized data (deserialized upon first request).

Returns:

  • (Object)

    lazy-deserialized data (deserialized upon first request)



38
39
40
41
42
43
44
45
46
# File 'lib/karafka/messages/message.rb', line 38

def payload
  return @payload if deserialized?

  @payload = deserialize
  # We mark deserialization as successful after deserialization, as in case of an error
  # this won't be falsely set to true
  @deserialized = true
  @payload
end