架构设计
- 前端:用户在Web应用界面输入文本,通过HTTP请求将文本发送到后端Ruby应用。
- 后端Ruby应用:
- 接收请求:使用Ruby的Web框架(如Rails、Sinatra等)接收前端发送的文本。
- 调用Azure认知服务:利用Azure SDK for Ruby调用Azure认知服务中的文本分析服务进行情感分析。
- 处理结果:接收情感分析结果,并准备将其存储到Azure Cosmos DB。
- 存储到Cosmos DB:使用Azure Cosmos DB的Ruby SDK将分析结果存储到指定的数据库和容器中。
- Azure认知服务:接收后端发送的文本,执行情感分析并返回结果。
- Azure Cosmos DB:存储情感分析结果。
Ruby代码示例
- 安装依赖:
gem install azure - cognitiveservices - textanalytics
gem install azure - cosmosdb
- 调用Azure认知服务进行情感分析:
require 'azure - cognitiveservices - textanalytics'
def analyze_sentiment(text)
text_analytics_client = Azure::CognitiveServices::TextAnalytics::TextAnalyticsClient.new(
api_key: 'YOUR_API_KEY',
endpoint: 'YOUR_ENDPOINT'
)
documents = [
{
id: '1',
text: text,
language: 'en'
}
]
result = text_analytics_client.sentiment(documents)
result.documents.first.score
end
- 将结果存储到Azure Cosmos DB:
require 'azure - cosmosdb'
def store_sentiment_result(sentiment_score)
account_endpoint = 'YOUR_COSMOSDB_ENDPOINT'
master_key = 'YOUR_COSMOSDB_MASTER_KEY'
client = Azure::CosmosDB::DocumentClient.new(account_endpoint, master_key)
database = client.databases.create_or_get('YOUR_DATABASE_NAME')
container = database.containers.create_or_get('YOUR_CONTAINER_NAME')
document = {
sentiment_score: sentiment_score
}
container.documents.create(document)
end
- 整合示例:
text = "Sample text for sentiment analysis"
sentiment_score = analyze_sentiment(text)
store_sentiment_result(sentiment_score)
处理网络故障
- 重试机制:
- 在调用Azure认知服务和Azure Cosmos DB时,使用重试库(如
retriable
gem)。
require'retriable'
def analyze_sentiment_with_retry(text)
Retriable.retriable(on: [Azure::Core::Http::HTTPError, Net::OpenTimeout, SocketError], tries: 3, sleep: 1) do
analyze_sentiment(text)
end
end
def store_sentiment_result_with_retry(sentiment_score)
Retriable.retriable(on: [Azure::Core::Http::HTTPError, Net::OpenTimeout, SocketError], tries: 3, sleep: 1) do
store_sentiment_result(sentiment_score)
end
end
- 错误日志记录:使用日志库(如
logger
gem)记录网络故障相关的错误信息,便于排查问题。
require 'logger'
logger = Logger.new(STDOUT)
begin
text = "Sample text for sentiment analysis"
sentiment_score = analyze_sentiment_with_retry(text)
store_sentiment_result_with_retry(sentiment_score)
rescue => e
logger.error("Network or service error: #{e.message}")
end
处理服务限流问题
- 遵循限流规则:查阅Azure认知服务和Azure Cosmos DB的限流文档,了解请求速率限制。
- 缓存:对于频繁分析的相似文本,可以考虑在本地缓存情感分析结果,减少对Azure认知服务的调用。
- 调整请求频率:在代码中实现逻辑,当检测到限流错误(如HTTP 429状态码)时,降低请求频率,例如通过增加请求之间的间隔时间来避免再次触发限流。
require 'azure - cognitiveservices - textanalytics'
require 'azure - cosmosdb'
require'retriable'
require 'logger'
logger = Logger.new(STDOUT)
def analyze_sentiment(text)
text_analytics_client = Azure::CognitiveServices::TextAnalytics::TextAnalyticsClient.new(
api_key: 'YOUR_API_KEY',
endpoint: 'YOUR_ENDPOINT'
)
documents = [
{
id: '1',
text: text,
language: 'en'
}
]
result = text_analytics_client.sentiment(documents)
result.documents.first.score
end
def analyze_sentiment_with_retry(text)
Retriable.retriable(on: [Azure::Core::Http::HTTPError, Net::OpenTimeout, SocketError], tries: 3, sleep: 1) do |tries|
begin
analyze_sentiment(text)
rescue Azure::Core::Http::HTTPError => e
if e.status_code == 429
sleep(2 ** tries) # 指数退避
retry
else
raise
end
end
end
end
def store_sentiment_result(sentiment_score)
account_endpoint = 'YOUR_COSMOSDB_ENDPOINT'
master_key = 'YOUR_COSMOSDB_MASTER_KEY'
client = Azure::CosmosDB::DocumentClient.new(account_endpoint, master_key)
database = client.databases.create_or_get('YOUR_DATABASE_NAME')
container = database.containers.create_or_get('YOUR_CONTAINER_NAME')
document = {
sentiment_score: sentiment_score
}
container.documents.create(document)
end
def store_sentiment_result_with_retry(sentiment_score)
Retriable.retriable(on: [Azure::Core::Http::HTTPError, Net::OpenTimeout, SocketError], tries: 3, sleep: 1) do |tries|
begin
store_sentiment_result(sentiment_score)
rescue Azure::Core::Http::HTTPError => e
if e.status_code == 429
sleep(2 ** tries) # 指数退避
retry
else
raise
end
end
end
end
begin
text = "Sample text for sentiment analysis"
sentiment_score = analyze_sentiment_with_retry(text)
store_sentiment_result_with_retry(sentiment_score)
rescue => e
logger.error("Error: #{e.message}")
end