log and skip duplicate events

This commit is contained in:
Brian Gough 2019-04-11 12:53:43 +01:00
parent 9a32c2eebb
commit 2a31139254
3 changed files with 16 additions and 4 deletions

View file

@ -24,7 +24,9 @@ module.exports = DocumentUpdaterController =
return
if message.op?
if message._id?
EventLogger.checkEventOrder("applied-ops", message._id, message)
status = EventLogger.checkEventOrder("applied-ops", message._id, message)
if status is 'duplicate'
return # skip duplicate events
DocumentUpdaterController._applyUpdateFromDocumentUpdater(io, message.doc_id, message.op)
else if message.error?
DocumentUpdaterController._processErrorFromDocumentUpdater(io, message.doc_id, message.error, message)
@ -33,6 +35,11 @@ module.exports = DocumentUpdaterController =
_applyUpdateFromDocumentUpdater: (io, doc_id, update) ->
clientList = io.sockets.clients(doc_id)
# avoid unnecessary work if no clients are connected
if clientList.length is 0
return
# send updates to clients
logger.log doc_id: doc_id, version: update.v, source: update.meta?.source, socketIoClients: (client.id for client in clientList), "distributing updates to clients"
seen = {}
# send messages only to unique clients (due to duplicate entries in io.sockets.clients)
for client in clientList when not seen[client.id]

View file

@ -26,11 +26,11 @@ module.exports = EventLogger =
return # order is ok
if (count == previous)
metrics.inc "event.#{channel}.duplicate"
# logger.error {key:key, previous: previous, count:count, message:message}, "duplicate event"
logger.warn {channel:channel, message_id:message_id}, "duplicate event"
return "duplicate"
else
metrics.inc "event.#{channel}.out-of-order"
# logger.error {key:key, previous: previous, count:count, message:message}, "events out of order"
logger.warn {channel:channel, message_id:message_id, key:key, previous: previous, count:count}, "out of order event"
return "out-of-order"
_storeEventCount: (key, count) ->

View file

@ -38,9 +38,14 @@ module.exports = WebsocketLoadBalancer =
io.sockets.emit(message.message, message.payload...)
else if message.room_id?
if message._id?
EventLogger.checkEventOrder("editor-events", message._id, message)
status = EventLogger.checkEventOrder("editor-events", message._id, message)
if status is "duplicate"
return # skip duplicate events
# send messages only to unique clients (due to duplicate entries in io.sockets.clients)
clientList = io.sockets.clients(message.room_id)
# avoid unnecessary work if no clients are connected
return if clientList.length is 0
logger.log {channel:channel, message: message.message, room_id: message.room_id, message_id: message._id, socketIoClients: (client.id for client in clientList)}, "distributing event to clients"
seen = {}
for client in clientList when not seen[client.id]
seen[client.id] = true