Generally speaking, if there is not ESB operating in the enterprise, avoid introducing one unless you have good justification, and mostly, there are few - if any! It might help you a lot in your decision if you have access to Gartner's awesome report Choosing an Architecture for Managing APIs and Services, they detailed the difference between Service-centric and API-centric architectures, and they suggested a No-ESB architecture where using ESBs is totally optional in modern architectures. They said explicitly there:
The majority of Gartner clients that have embarked on [Service-Centric] have failed to achieve measurable success, because they prioritized governance for control rather than productivity.
Stay focused on the future, which is an API-centric world.
Which seems appropriate to your case.
There is some good excerpts from this report in these slides Monolith to serverless: service-based architectures in the enterprise, and if you are an Arabic speaker you can watch the accompanied session with the slides.
And now the details, which are mostly subjective, and depends on my personal experience that might be different than others' experience and answers...
The driver was to make the services reusable across channels and the enterprise and to utilize the existing infrastructure (ESB).
Reusability is overrated, and adds a lot of complexity to the architecture, and the integration will be a bottleneck. But since you already have an operating ESB, and it seems as if you are forced to use it, then, well, use it wisely and try to get the most benefit you can from it.
1- Is it a good practice to make ESB between front end and back end generally?
No. Layers of indirection add complexity, and this complexity should be justified.
Here are some valid justifications:
- All applications in the enterprise works in the same way. Here consistency wins. And this answers your question:
3- Is it worth keeping an additional layer with all the burden of its maintenance only because it might be used sometime in the future and to keep all communications consistent?
- The ESB already exists in the enterprise and you need some of its functionality, e.g. you need orchestration, enrichment, transformation, or messaging/asynchronous communication. The most needed of these is messaging and you can simply use a message broker for it, e.g. RabbitMQ if there is no other existing solution in the enterprise, which is not your case since there is an operating ESB.
- You have a lot of integrations in the enterprise and point-to-point integration became a mess, then adding a layer of indirection will be helpful to add some order to the chaos. This layer of indirection might be a centralized ESB or something else (see below).
It's just an abstraction layer between FE and BE whose businesses are tightly coupled.
Now, it seems you will not get much benefit of it. But of you can if you want. For example, you can get a lot of insights about your services/APIs usage and performance if all requests pass through a centralized thing (why I say thing not ESB? See below).
2- In case some services might be reusable and most are not, what is the best practice?
My preference is to have a centralized thing, but this is subjective...
Use ESB for all, as mentioned, for unification and consistency
The pros: consistency + I can add here cross-cutting concerns like security and logging at request level.
The cons: single-point of failure, vendor-lock in, scalability will be a big thing to consider.
Meanwhile, my endpoints are as smart as much as possible, and the centralized thing is as dumb as possible (see: Smart endpoints and dumb pipes)
Then, what is the thing I mentioned before?
Actually, it is an API gateway, or a full-fledged API platform, and I have a very good success story in a big enterprise where we used API platform for integration as well, but we enriched it with a dumb message broker, and centralized logging. And all the heavy liftings are kept in the APIs (smart endpoints).
My final advise would be: If you can move away from the ESB then do, but if you cannot, then try to get the most out of if.