userver: userver/ydb/component.hpp Source File
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Modules Pages Concepts
component.hpp
Go to the documentation of this file.
1#pragma once
2
3/// @file userver/ydb/component.hpp
4/// @brief @copybrief ydb::YdbComponent
5
6#include <memory>
7#include <string>
8#include <unordered_map>
9
10#include <userver/components/component_base.hpp>
11#include <userver/dynamic_config/source.hpp>
12#include <userver/formats/json.hpp>
13#include <userver/utils/statistics/fwd.hpp>
14#include <userver/utils/statistics/storage.hpp>
15
16#include <userver/ydb/fwd.hpp>
17
18#include <ydb-cpp-sdk/client/driver/fwd.h>
19
20USERVER_NAMESPACE_BEGIN
21
22namespace ydb {
23
24namespace impl {
25class Driver;
26} // namespace impl
27
28// clang-format off
29
30/// @ingroup userver_components
31///
32/// @brief YDB client component
33///
34/// Provides access to ydb::TableClient, ydb::TopicClient, ydb::CoordinationClient.
35///
36/// ## Static options:
37/// Name | Description | Default value
38/// ---- | ----------- | -------------
39/// `credentials-provider` | name of credentials provider component | -
40/// `operation-settings.retries` | default retries count for an operation | 3
41/// `operation-settings.operation-timeout` | default operation timeout in utils::StringToDuration() format | 1s
42/// `operation-settings.cancel-after` | cancel operation after specified string in utils::StringToDuration() format | 1s
43/// `operation-settings.client-timeout` | default client timeout in utils::StringToDuration() format | 1s
44/// `operation-settings.get-session-timeout` | default session timeout in milliseconds | 5s
45/// `databases.<dbname>.endpoint` | gRPC endpoint URL, e.g. grpc://localhost:1234 | -
46/// `databases.<dbname>.database` | full database path, e.g. /ru/service/production/database | -
47/// `databases.<dbname>.credentials` | credentials config passed to credentials provider component | -
48/// `databases.<dbname>.min_pool_size` | minimum pool size for database with name `<dbname>` | 10
49/// `databases.<dbname>.max_pool_size` | maximum pool size for database with name `<dbname>` | 50
50/// `databases.<dbname>.get_session_retry_limit` | retries count to get session, every attempt with a get-session-timeout | 5
51/// `databases.<dbname>.keep-in-query-cache` | whether to use query cache | true
52/// `databases.<dbname>.prefer_local_dc` | prefer making requests to local DataCenter | false
53/// `databases.<dbname>.aliases` | list of alias names for this database | []
54/// `databases.<dbname>.sync_start` | fail on boot time if YDB is not accessible | true
55/// `databases.<dbname>.by-database-timings-buckets-ms` | histogram bounds for by-database timing metrics | 40 buckets with +20% increment per step
56/// `databases.<dbname>.by-query-timings-buckets-ms` | histogram bounds for by-query timing metrics | 15 buckets with +100% increment per step
57
58// clang-format on
59
60class YdbComponent final : public components::ComponentBase {
61public:
62 /// @ingroup userver_component_names
63 /// @brief The default name of ydb::YdbComponent component
64 static constexpr std::string_view kName = "ydb";
65
66 YdbComponent(const components::ComponentConfig&, const components::ComponentContext&);
67
68 ~YdbComponent();
69
70 /// Get table client
71 /// @param dbname database name from static config key
72 std::shared_ptr<TableClient> GetTableClient(const std::string& dbname) const;
73
74 /// Get topic client
75 /// @param dbname database name from static config key
76 std::shared_ptr<TopicClient> GetTopicClient(const std::string& dbname) const;
77
78 /// Get coordination client
79 /// @param dbname database name from static config key
80 std::shared_ptr<CoordinationClient> GetCoordinationClient(const std::string& dbname) const;
81
82 /// Get native driver
83 /// @param dbname database name from static config key
84 /// @warning Use with care! Facilities from
85 /// `<core/include/userver/drivers/subscribable_futures.hpp>` can help with
86 /// non-blocking wait operations.
87 const NYdb::TDriver& GetNativeDriver(const std::string& dbname) const;
88
89 /// Get database path
90 /// @param dbname database name from static config key
91 const std::string& GetDatabasePath(const std::string& dbname) const;
92
93 static yaml_config::Schema GetStaticConfigSchema();
94
95private:
96 struct DatabaseUtils;
97
98 struct Database {
99 std::shared_ptr<impl::Driver> driver;
100 std::shared_ptr<TableClient> table_client;
101 std::shared_ptr<TopicClient> topic_client;
102 std::shared_ptr<CoordinationClient> coordination_client;
103 };
104
105 void OnConfigUpdate(const dynamic_config::Snapshot& cfg);
106 void WriteStatistics(utils::statistics::Writer& writer) const;
107 const Database& FindDatabase(const std::string& dbname) const;
108
109 std::unordered_map<std::string, Database> databases_;
110
111 dynamic_config::Source config_;
112
113 // These fields must be the last ones
114 concurrent::AsyncEventSubscriberScope config_subscription_;
115 utils::statistics::Entry statistic_holder_;
116};
117
118} // namespace ydb
119
120template <>
121inline constexpr bool components::kHasValidate<ydb::YdbComponent> = true;
122
123USERVER_NAMESPACE_END