How to model a simple chat system as a microservice architecture?

In an attempt to learn how microservices work, I’m going to attempt to convert a simple monolithic chat server to a microservice architecture.

I’ve created a simple chat system as a monolith, modelled as such:
Monolith Diagram

These services are tightly coupled, as you can see with the foreign key relationships.

When creating a message at POST /message, I would do the following steps:

  • Check if the user is a participant at the given channel id
  • Attempt to add the message to the message table

Due to FK constraints, the channel id and author id are validated when inserting a message.

Now here is my attempt on how I would model it as a microservice architecture:
Microservice Diagram
Ids are changed to NUMERIC because I plan on using 128-bit integers as an id.
Specifically boundary’s flake due to its simplicity.

  • User service is decoupled
  • Channel service and channel participants are part of a single microservice
  • Message service is decoupled

I’m planning on using RabbitMQ to connect the services.
When creating a message at POST /message, I’d now do the following steps:

  • Add a “Message Create Event” to the RabbitMQ exchange where the user services are subscribed to
  • User services verify the integrity of the author id, and then passes the event to an exchange that channel services are subscribed to
  • Channel services verify the integrity of the channel id, and verifies the author id is in the channel participant table, and then passes the event to an exchange that message services are subscribed to
  • Message services adds a new row to its table

Since these microservices are event-driven and asynchronous by nature, all of my routes would now have to return 202 - Accepted.

Is there any obvious red flags with this approach? What else can I improve on for this plan?